authoring — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited authoring (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.
This skill covers creating and editing openEHR specification documents — the AsciiDoc sources that live in specifications-XX repositories (RM, AM, BASE, LANG, PROC, SM, QUERY, CNF, TERM, ITS-*).
Note: specifications-ITS-REST is an exception — it uses OpenAPI YAML with embedded Markdown rather than the standard AsciiDoc approach. See the "ITS-REST Exception" section below.docs/UML/ from BMM via bmm-publisherreferences/cross-references.md for attribute naming patternsEach specification component lives in its own repo: specifications-XX (e.g., specifications-RM). The shared infrastructure repo specifications-AA_GLOBAL provides boilerplate, styles, references, and publishing scripts used by all components.
specifications-XX/
├── manifest.json # Component metadata, specs, releases, Jira links
├── docs/
│ ├── index.adoc # Component index page
│ ├── <spec-id>/ # One directory per specification
│ │ ├── master.adoc # Main entry point
│ │ ├── manifest_vars.adoc # Per-spec variables
│ │ ├── master00-amendment_record.adoc
│ │ ├── master01-preface.adoc
│ │ ├── master02-*.adoc ... masterNN-*.adoc
│ │ ├── diagrams/ # SVG/PNG diagrams
│ │ └── images/ # Other images
│ ├── UML/ # BMM-generated class docs + diagrams (do NOT hand-edit; see class-generation skill)
│ └── common/ # Shared content within componentThe specifications-AA_GLOBAL repo (always a sibling) provides:
specifications-AA_GLOBAL/
├── docs/boilerplate/ # Shared AsciiDoc includes
│ ├── global_vars.adoc # Global Asciidoctor attributes
│ ├── book_style_settings.adoc
│ ├── basic_style_settings.adoc
│ ├── full_front_block.adoc # Full front matter (with block diagram)
│ ├── short_front_block.adoc # Short front matter (without block diagram)
│ ├── doc_id_block.adoc # Release/status/revision table
│ └── licence_block.adoc # Copyright and licence table
├── docs/references/
│ └── reference_definitions.adoc # All cross-spec and external URLs
├── resources/css/ # Stylesheets
├── resources/logos/ # openEHR logos
└── bin/
├── spec_publish.sh # Main publishing script
└── do_spec_publish.sh # WrapperThe {ref_dir} Asciidoctor attribute resolves to the AA_GLOBAL repo root relative to the consuming spec document.
Under specifications-XX/docs/, create a directory matching the spec id from manifest.json.
manifest_vars.adocThis file defines per-document Asciidoctor attributes used by the boilerplate:
:spec_title: EHR Information Model
:copyright_year: 2003
:spec_status: STABLE
:keywords: EHR, EMR, reference model, openehr
:description: openEHR EHR Information Model specificationFields:
DEVELOPMENT, TRIAL, STABLE, SUPERSEDED, OBSOLETE, RETIREDmaster.adocThe master file follows a strict structure. Here is the canonical template:
//
// ============================================ Asciidoc HEADER =============================================
//
include::{ref_dir}/docs/boilerplate/book_style_settings.adoc[]
include::manifest_vars.adoc[]
include::{ref_dir}/docs/boilerplate/global_vars.adoc[]
//
// ============================================ Asciidoc PREAMBLE =============================================
//
image::{openehr_logo}["openEHR logo",align="center"]
= {spec_title}
include::{ref_dir}/docs/boilerplate/full_front_block.adoc[]
include::{ref_dir}/docs/references/reference_definitions.adoc[]
//
// ============================================= Asciidoc BODY ===============================================
//
//
// --------------------------------------------- Preface -----------------------------------------------
//
== Acknowledgements
=== Editor
* <Editor Name>, <Affiliation>.
=== Contributors
<List of contributors>
=== Trademarks
* 'openEHR' is a trademark of the openEHR Foundation
//
// --------------------------------------------- CHAPTERS -----------------------------------------------
//
:sectnums:
ifdef::package_qualifiers[]
:pkg: org.openehr.<component>.<spec>.
endif::[]
include::master01-preface.adoc[leveloffset=+1]
include::master02-overview.adoc[leveloffset=+1]
// ... additional chapters ...
//
// --------------------------------------------- Amendment Record -----------------------------------------------
//
:sectnums!:
include::master00-amendment_record.adoc[leveloffset=+1]
//
// --------------------------------------------- REFERENCES -----------------------------------------------
//
:sectnums!:
== References
bibliography::[]Include order in the header matters:
book_style_settings.adoc — sets doctype, syntax highlighter, TOCmanifest_vars.adoc — local spec variablesglobal_vars.adoc — global openEHR attributes (depends on nothing above)Front block choice:
full_front_block.adoc for primary specifications (includes block diagram)short_front_block.adoc for secondary/overview documents (no block diagram)master00-amendment_record.adoc= Amendment Record
[cols="1a,6,2,2a", options="header"]
|===
|Issue|Details|Raiser|Completed
|[[latest_issue]]0.1.0
|Initial writing.
|<Author Name>
|[[latest_issue_date]]<dd Mon yyyy>
|===The [[latest_issue]] and [[latest_issue_date]] anchors are required — the doc_id_block.adoc references them to display revision and date in the front matter table.
Amendment record entries reference Jira tickets using {spec_tickets}/SPECXX-NNN[SPECXX-NNN^] syntax. Release boundaries are marked with a full-width header row:
4+^h|*RM Release 1.1.0*Name chapters sequentially: master01-preface.adoc, master02-overview.adoc, etc.
The preface (master01-preface.adoc) typically contains:
manifest.jsonAdd the new specification entry to the specifications array. See references/manifest-spec-entry.md for the full field reference.
# From the parent directory containing all specifications-XX repos:
./specifications-AA_GLOBAL/bin/spec_publish.sh -f -v XX
# Or via Docker:
docker run -u $(id -u):$(id -g) -v "$(pwd):/documents/" openehr/asciidoctor development XXmasterNN-*.adoc files directly. Never edit files under docs/UML/ — those are generated from the component's BMM schema by bmm-publisher (see the class-generation skill); change the BMM and regenerate.<<anchor_name>> or <<anchor_name, display text>>.reference_definitions.adoc: {openehr_rm_common}[Common IM^]
{openehr_rm_data_types}#dv_quantity[DV_QUANTITY^]{classes_url_root} for linking to the class index.{spec_tickets}/SPECRM-87[SPECRM-87^]reference_definitions.adoc first — it has hundreds of pre-defined URLs for HL7, W3C, ISO, IETF, Wikipedia, SNOMED, etc.All release version attributes follow the pattern :{component_id}_release: and default to latest. These are defined in global_vars.adoc:
:rm_release: latest
:am_release: latest
:base_release: latest
...When publishing a named release, the publisher overrides these via -a rm_release=Release-1.0.4.
References follow a consistent naming convention:
:openehr_{component}_{spec}: {openehr_{component}_releases}/{spec}.html
:openehr_{component}_latest_{spec}: {openehr_{component}_latest}/{spec}.html
:openehr_{component}_development_{spec}: {openehr_{component}_development}/{spec}.htmlWhen adding new references, follow this pattern exactly.
When editing a specification, always update the amendment record:
[[latest_issue]] version and [[latest_issue_date]] date on the new top entry<spec-id>/diagrams/image::{diagrams_uri}/<filename>[...]bmm-publisher (which renders them to SVG via PlantUML). This replaces the historical MagicDraw .mdzip extraction. See the class-generation skill to regenerate them.The specifications-ITS-REST component uses a different authoring approach:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.