class-generation — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited class-generation (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Treat the per-class definition tables and the UML class/package diagrams embedded in specifications-XX documents as generated output, never hand-written. Generate them from the component's BMM (Basic Meta-Model) schema, serialised as P_BMM JSON, with the bmm-publisher CLI tool.
Replaces MagicDraw. Class tables and diagrams were historically extracted from MagicDraw.mdzipUML models. That mechanism is retired;bmm-publisheris the current BMM-based generator.
For the full command, option, and schema reference, see references/bmm-publisher.md.
Regenerate class documentation when:
docs/UML/classes/ tables refreshed before a releaseRun the tool from its Docker image, which bundles all openEHR BMM schemas and the plantuml CLI, so no local PHP, Composer, or checkout is needed.
# Discover commands
docker run --rm ghcr.io/openehr/bmm-publisher listTo run from a cloned bmm-publisher checkout instead, see "Local development" in references/bmm-publisher.md.
| Command | Use for |
|---|---|
legacy-adoc | Flat per-class definition tables for the legacy docs/UML/classes layout; -o <container-dir> sets the target, e.g. /app/output/UML/classes |
asciidoc (adoc) | Class, effective (flattened), and definition tables plus rendered SVG class/package diagrams (current layout) |
Pass the component repo's own BMM file as a path, mounted into the container under /in/, and a repeatable -d with the path of each dependency schema, loaded for cross-references only (not exported). A bare schema id (openehr_base_1.3.0) or all loads the copy bundled in the image, which lags the repos: a run from an id exits 0 but renders the older model, so use ids only to reproduce published output. Add -v to log each file read (confirm it is /in/…) or -vv for detail. The other commands (plantuml, embed-svg, yaml, split-json, odin) and all options are in references/bmm-publisher.md.
bmm-publisher writes two layouts. Read the target component's chapter files to pick one: include::{uml_export_dir}/classes/... lines mean the legacy layout. If neither layout is evident, ask the user.
docs/UML/classes/ (the include model)legacy-adoc produces one .adoc table per class, named org.openehr.<component>.<package>.<class>.adoc (the class segment is lowercased, e.g. org.openehr.base.base_types.access_group_ref.adoc). These are placed in the component's docs/UML/classes/ directory and pulled into chapter files via the {uml_export_dir} attribute (which resolves to ../UML):
include::{uml_export_dir}/classes/{pkg}composition.adoc[]{pkg} is the :pkg: attribute set in master.adoc (see authoring). This is the layout enforced by the review skill's ADOC-03 check.
output/Adoc/<schema>/ (tables + rendered SVGs)asciidoc produces classes/, effective/, definitions/, plantUML/, and rendered SVGs under images/uml/{classes,diagrams}/. Diagrams are referenced with Antora-style resource macros:
image::ROOT:uml/classes/COMPOSITION.svg[]Guardrails). The schema is computable/BMM/openehr_<component>_<version>.bmm.json; each dependency comes from its sibling clone (RM, AM, LANG and TERM classes refer to BASE types: ../specifications-BASE/computable/BMM/openehr_base_<version>.bmm.json). When a file is missing, say which and stop rather than falling back to a bundled id. If the schema was edited by hand, run the bmm-authoring checker on it first.
legacy-adoc for the legacy layout, asciidoc forthe current one.
host user (RM shown, with its BASE dependency):
OUT=$(mktemp -d)
docker run --rm --user $(id -u):$(id -g) \
-v "$PWD/computable/BMM/openehr_rm_1.2.0.bmm.json":/in/openehr_rm_1.2.0.bmm.json:ro \
-v "$PWD/../specifications-BASE/computable/BMM/openehr_base_1.3.0.bmm.json":/in/openehr_base_1.3.0.bmm.json:ro \
-v "$OUT":/app/output \
ghcr.io/openehr/bmm-publisher asciidoc -v /in/openehr_rm_1.2.0.bmm.json -d /in/openehr_base_1.3.0.bmm.jsonFor the legacy layout, run legacy-adoc -v -o /app/output/UML/classes /in/<schema>.bmm.json -d /in/<dependency>.bmm.json instead; the tables land in $OUT/UML/classes. Without the dependency, links to its types come out as link:/classes/<Type>.
$OUT/UML/classes/*.adoc into the component'sdocs/UML/classes/. Current layout: ask the user how the component wires the output/Adoc/<schema>/ content. Ask before overwriting files in a specifications-XX repo, and do not commit.
authoring skill) and confirming class tables anddiagrams render and cross-references resolve.
The user-only /openehr-specs:regen-classes skill covers steps 1 to 3 only (output to ./out, no placement, no commit). When the user has already run it, continue from step 4. For a local preview, the user can run /openehr-specs:publish <component>.
manifest.json id,or the directory name specifications-<id>) hold no model of their own. Run no bmm-publisher command there, neither class tables nor any other format. Say so, and stop. ITS-BMM regenerates its ODIN and YAML with its own make generate, which its AGENTS.md describes.
bmm-authoring) and regenerate.A clean run does not prove the schema is right: bmm-publisher renders many modelling mistakes as type Any or drops them without a message, so run the bmm-authoring checker first.
/in/ and pass their paths. Do notmount a directory over /app/resources: it hides the bundled schemas, so a dependency named by id is then missing and the run exits 1.
is upstream input** in a cloned bmm-publisher` checkout: do not modify itunless the task is specifically to change the model.
-d so type links resolve (e.g. RM depends on BASE).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.