{
	"$schema": "https://json-schema.org/draft/2020-12/schema",
	"$id": "https://ooml.org/schema/ooml.0.1.0.json",
	"title": "OOML 0.1.0 Artefact Schema",
	"description": "An OOML document is one of: a class artefact or a global attribute artefact. Discrimination is by the presence of top-level 'kind' (global attribute) vs its absence (class).",
	"$defs": {
		"semver": {
			"type": "string",
			"description": "A semantic version string: MAJOR.MINOR.TRIVIAL with optional pre-release and build metadata.",
			"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"
		},
		"semverRange": {
			"type": "string",
			"description": "A semver version range: exact, ^, ~, >=x <y, or *.",
			"pattern": "^(\\*|(>=?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(\\s*<(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*))?)|([~^])?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*).*)$"
		},
		"namespace": {
			"type": "string",
			"description": "Reverse-domain namespace: one or more lowercase alphanumeric segments separated by dots.",
			"pattern": "^[a-z][a-z0-9]*(\\.[a-z][a-z0-9]*)+$"
		},
		"classFqn": {
			"type": "string",
			"description": "Exact FQN of a class: namespace/ClassName@version",
			"pattern": "^[a-z][a-z0-9]*(\\.[a-z][a-z0-9]*)*/[A-Z][A-Za-z0-9]*@(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*).*$"
		},
		"globalAttrFqn": {
			"type": "string",
			"description": "Exact FQN of a global attribute: namespace/attrName@version",
			"pattern": "^[a-z][a-z0-9]*(\\.[a-z][a-z0-9]*)*/[a-z][a-zA-Z0-9]*@(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*).*$"
		},
		"classFqnRange": {
			"type": "string",
			"description": "FQN range referencing a class: namespace/ClassName@versionRange or 'self'.",
			"pattern": "^(self|[a-z][a-z0-9]*(\\.[a-z][a-z0-9]*)*/[A-Z][A-Za-z0-9]*@.+)$"
		},
		"globalAttrFqnRange": {
			"type": "string",
			"description": "FQN range referencing a global attribute: namespace/attrName@versionRange.",
			"pattern": "^[a-z][a-z0-9]*(\\.[a-z][a-z0-9]*)*/[a-z][a-zA-Z0-9]*@.+$"
		},
		"attributeIdentifier": {
			"type": "string",
			"description": "camelCase attribute identifier.",
			"pattern": "^[a-z][a-zA-Z0-9]*$"
		},
		"primitiveTypeName": {
			"type": "string",
			"description": "One of the built-in OOML primitive type names.",
			"enum": [
				"boolean",
				"int8",
				"int16",
				"int32",
				"int64",
				"uint8",
				"uint16",
				"uint32",
				"uint64",
				"float32",
				"float64",
				"decimal",
				"string",
				"date",
				"time",
				"datetime",
				"duration",
				"uuid",
				"uri",
				"binary",
				"any"
			]
		},
		"attributeKind": {
			"type": "string",
			"description": "Structural role of an attribute.",
			"enum": [
				"primitive",
				"object",
				"class",
				"enum",
				"list",
				"set",
				"map",
				"attribute",
				"nested"
			]
		},
		"nonEmptyString": {
			"type": "string",
			"minLength": 1
		},
		"authors": {
			"type": "array",
			"items": {
				"type": "string",
				"minLength": 1
			},
			"description": "Authors in 'Name <email>' format."
		},
		"extendsValue": {
			"description": "Superclass FQN range(s). A string or array of strings; omit for no superclass.",
			"oneOf": [
				{
					"$ref": "#/$defs/classFqnRange"
				},
				{
					"type": "array",
					"items": {
						"$ref": "#/$defs/classFqnRange"
					},
					"minItems": 1
				}
			]
		},
		"metadataEntryCompound": {
			"type": "object",
			"description": "Compound-form metadata attribute value with control properties.",
			"properties": {
				"value": {
					"description": "The metadata value. May be null to declare a required slot without providing a value."
				},
				"required": {
					"type": "boolean",
					"description": "Whether a concrete non-null value must be present. Default: true."
				},
				"cascade": {
					"type": "boolean",
					"description": "If true, the value propagates to subclasses that do not set their own. Default: false."
				},
				"local": {
					"type": "boolean",
					"description": "If true, this entry is not inherited by subclasses. Default: false."
				},
				"final": {
					"type": "boolean",
					"description": "If true, subclasses cannot override this entry's value. Default: false."
				}
			},
			"required": [
				"value"
			],
			"additionalProperties": false,
			"not": {
				"description": "Rule M01: local and cascade must not both be true.",
				"properties": {
					"local": {
						"const": true
					},
					"cascade": {
						"const": true
					}
				},
				"required": [
					"local",
					"cascade"
				]
			}
		},
		"metadataEntry": {
			"description": "A metadata schema attribute value: short form (any scalar/non-object) or compound form.",
			"oneOf": [
				{
					"description": "Short form: a direct scalar value (string, number, boolean, null, array).",
					"not": {
						"type": "object"
					}
				},
				{
					"$ref": "#/$defs/metadataEntryCompound"
				}
			]
		},
		"metadataSchemaValue": {
			"type": "object",
			"description": "A metadata entry object: keys are attribute names of the schema class; values are metadata entries.",
			"additionalProperties": {
				"$ref": "#/$defs/metadataEntry"
			}
		},
		"metadataObject": {
			"type": "object",
			"description": "The metadata property: keys are metadata schema FQN ranges; values are schema attribute maps.",
			"additionalProperties": {
				"$ref": "#/$defs/metadataSchemaValue"
			}
		},
		"commonAttributeProperties": {
			"description": "Properties shared by all attribute kinds.",
			"properties": {
				"name": {
					"$ref": "#/$defs/nonEmptyString",
					"description": "Free-form human-readable label for this attribute."
				},
				"description": {
					"$ref": "#/$defs/nonEmptyString",
					"description": "Human-readable purpose of this attribute."
				},
				"required": {
					"type": "boolean",
					"description": "Whether instances MUST carry a value for this attribute. Default: false. Must not be true on static attributes."
				},
				"nullable": {
					"type": "boolean",
					"description": "Whether the instance-level value may be null. Default: false. Must not be true on static attributes."
				},
				"static": {
					"type": "boolean",
					"description": "If true, the value belongs to the class rather than instances. Default: false."
				},
				"value": {
					"description": "The class-level value for a static attribute. Must not appear on non-static attributes."
				},
				"local": {
					"type": "boolean",
					"description": "If true, this attribute is not inherited by subclasses. Default: false."
				},
				"final": {
					"type": "boolean",
					"description": "If true, subclasses cannot shadow or redeclare this attribute. Default: false."
				},
				"deprecated": {
					"$ref": "#/$defs/nonEmptyString",
					"description": "Deprecation message. Omit when not deprecated."
				}
			},
			"required": [
				"name"
			]
		},
		"primitiveAttribute": {
			"description": "An attribute of kind 'primitive'.",
			"allOf": [
				{
					"$ref": "#/$defs/commonAttributeProperties"
				},
				{
					"type": "object",
					"properties": {
						"kind": {
							"const": "primitive"
						},
						"type": {
							"$ref": "#/$defs/primitiveTypeName"
						},
						"minLength": {
							"type": "integer",
							"minimum": 0
						},
						"maxLength": {
							"type": "integer",
							"minimum": 0
						},
						"pattern": {
							"type": "string"
						},
						"minimum": {
							"type": "number"
						},
						"maximum": {
							"type": "number"
						},
						"exclusiveMinimum": {
							"type": "number"
						},
						"exclusiveMaximum": {
							"type": "number"
						},
						"precision": {
							"type": "integer",
							"minimum": 1
						},
						"scale": {
							"type": "integer",
							"minimum": 0
						},
						"encoding": {
							"type": "string"
						},
						"name": {},
						"description": {},
						"required": {},
						"nullable": {},
						"static": {},
						"value": {},
						"local": {},
						"final": {},
						"deprecated": {}
					},
					"required": [
						"kind",
						"type"
					],
					"additionalProperties": false
				}
			]
		},
		"objectAttribute": {
			"description": "An attribute of kind 'object': reference to an instance of a class or any subtype, identified by that instance's identity.",
			"allOf": [
				{
					"$ref": "#/$defs/commonAttributeProperties"
				},
				{
					"type": "object",
					"properties": {
						"kind": {
							"const": "object"
						},
						"type": {
							"$ref": "#/$defs/classFqnRange"
						},
						"name": {},
						"description": {},
						"required": {},
						"nullable": {},
						"static": {},
						"value": {},
						"local": {},
						"final": {},
						"deprecated": {}
					},
					"required": [
						"kind",
						"type"
					],
					"additionalProperties": false
				}
			]
		},
		"classAttribute": {
			"description": "An attribute of kind 'class': reference to a class itself or any subtype.",
			"allOf": [
				{
					"$ref": "#/$defs/commonAttributeProperties"
				},
				{
					"type": "object",
					"properties": {
						"kind": {
							"const": "class"
						},
						"type": {
							"$ref": "#/$defs/classFqnRange"
						},
						"name": {},
						"description": {},
						"required": {},
						"nullable": {},
						"static": {},
						"value": {},
						"local": {},
						"final": {},
						"deprecated": {}
					},
					"required": [
						"kind",
						"type"
					],
					"additionalProperties": false
				}
			]
		},
		"enumAttribute": {
			"description": "An attribute of kind 'enum': reference to a subtype of the named root class, excluding the named root class itself.",
			"allOf": [
				{
					"$ref": "#/$defs/commonAttributeProperties"
				},
				{
					"type": "object",
					"properties": {
						"kind": {
							"const": "enum"
						},
						"type": {
							"$ref": "#/$defs/classFqnRange"
						},
						"name": {},
						"description": {},
						"required": {},
						"nullable": {},
						"static": {},
						"value": {},
						"local": {},
						"final": {},
						"deprecated": {}
					},
					"required": [
						"kind",
						"type"
					],
					"additionalProperties": false
				}
			]
		},
		"collectionValueKind": {
			"type": "string",
			"description": "Kind of collection values. May be 'nested' for an inline sub-attribute shape.",
			"enum": [
				"primitive",
				"object",
				"class",
				"enum",
				"attribute",
				"nested"
			]
		},
		"collectionValueType": {
			"description": "Shape of collection values: primitive name, class FQN range, global attribute FQN range, 'self', or (when valueKind is 'nested') an inline non-empty sub-attribute map.",
			"oneOf": [
				{
					"$ref": "#/$defs/primitiveTypeName"
				},
				{
					"$ref": "#/$defs/classFqnRange"
				},
				{
					"$ref": "#/$defs/globalAttrFqnRange"
				},
				{
					"$ref": "#/$defs/attributesObject",
					"minProperties": 1
				}
			]
		},
		"listAttribute": {
			"description": "An attribute of kind 'list': ordered sequence allowing duplicates.",
			"allOf": [
				{
					"$ref": "#/$defs/commonAttributeProperties"
				},
				{
					"type": "object",
					"properties": {
						"kind": {
							"const": "list"
						},
						"valueKind": {
							"$ref": "#/$defs/collectionValueKind"
						},
						"valueType": {
							"$ref": "#/$defs/collectionValueType"
						},
						"minItems": {
							"type": "integer",
							"minimum": 0
						},
						"maxItems": {
							"type": "integer",
							"minimum": 0
						},
						"name": {},
						"description": {},
						"required": {},
						"nullable": {},
						"static": {},
						"value": {},
						"local": {},
						"final": {},
						"deprecated": {}
					},
					"required": [
						"kind",
						"valueKind"
					],
					"additionalProperties": false
				}
			]
		},
		"setAttribute": {
			"description": "An attribute of kind 'set': unordered collection without duplicates.",
			"allOf": [
				{
					"$ref": "#/$defs/commonAttributeProperties"
				},
				{
					"type": "object",
					"properties": {
						"kind": {
							"const": "set"
						},
						"valueKind": {
							"$ref": "#/$defs/collectionValueKind"
						},
						"valueType": {
							"$ref": "#/$defs/collectionValueType"
						},
						"minItems": {
							"type": "integer",
							"minimum": 0
						},
						"maxItems": {
							"type": "integer",
							"minimum": 0
						},
						"name": {},
						"description": {},
						"required": {},
						"nullable": {},
						"static": {},
						"value": {},
						"local": {},
						"final": {},
						"deprecated": {}
					},
					"required": [
						"kind",
						"valueKind"
					],
					"additionalProperties": false
				}
			]
		},
		"mapAttribute": {
			"description": "An attribute of kind 'map': key-value pairs with unique keys.",
			"allOf": [
				{
					"$ref": "#/$defs/commonAttributeProperties"
				},
				{
					"type": "object",
					"properties": {
						"kind": {
							"const": "map"
						},
						"keyKind": {
							"$ref": "#/$defs/collectionKeyKind"
						},
						"keyType": {
							"$ref": "#/$defs/collectionKeyType"
						},
						"valueKind": {
							"$ref": "#/$defs/collectionValueKind"
						},
						"valueType": {
							"$ref": "#/$defs/collectionValueType"
						},
						"minItems": {
							"type": "integer",
							"minimum": 0
						},
						"maxItems": {
							"type": "integer",
							"minimum": 0
						},
						"name": {},
						"description": {},
						"required": {},
						"nullable": {},
						"static": {},
						"value": {},
						"local": {},
						"final": {},
						"deprecated": {}
					},
					"required": [
						"kind",
						"valueKind"
					],
					"additionalProperties": false
				}
			]
		},
		"globalAttributeReference": {
			"description": "An attribute of kind 'attribute': references a standalone global attribute. Type-specific constraint properties and 'deprecated' MAY be adjusted as direct siblings, following the override-eligibility and narrowing rules of \u00a712.4 (\u00a79.9).",
			"allOf": [
				{
					"$ref": "#/$defs/commonAttributeProperties"
				},
				{
					"type": "object",
					"properties": {
						"kind": {
							"const": "attribute"
						},
						"type": {
							"$ref": "#/$defs/globalAttrFqnRange"
						},
						"name": {},
						"description": {},
						"required": {},
						"nullable": {},
						"static": {},
						"value": {},
						"local": {},
						"final": {},
						"deprecated": {},
						"minLength": {
							"type": "integer",
							"minimum": 0
						},
						"maxLength": {
							"type": "integer",
							"minimum": 0
						},
						"minimum": {
							"type": "number"
						},
						"maximum": {
							"type": "number"
						},
						"exclusiveMinimum": {
							"type": "number"
						},
						"exclusiveMaximum": {
							"type": "number"
						},
						"precision": {
							"type": "integer",
							"minimum": 1
						},
						"scale": {
							"type": "integer",
							"minimum": 0
						},
						"pattern": {
							"type": "string"
						}
					},
					"required": [
						"kind",
						"type"
					],
					"additionalProperties": false
				}
			]
		},
		"anyAttribute": {
			"description": "Any attribute, discriminated by 'kind'.",
			"oneOf": [
				{
					"$ref": "#/$defs/primitiveAttribute"
				},
				{
					"$ref": "#/$defs/objectAttribute"
				},
				{
					"$ref": "#/$defs/classAttribute"
				},
				{
					"$ref": "#/$defs/enumAttribute"
				},
				{
					"$ref": "#/$defs/listAttribute"
				},
				{
					"$ref": "#/$defs/setAttribute"
				},
				{
					"$ref": "#/$defs/mapAttribute"
				},
				{
					"$ref": "#/$defs/globalAttributeReference"
				},
				{
					"$ref": "#/$defs/nestedAttribute"
				}
			]
		},
		"attributesObject": {
			"type": "object",
			"description": "Map of attribute identifier (camelCase) to attribute.",
			"propertyNames": {
				"$ref": "#/$defs/attributeIdentifier"
			},
			"additionalProperties": {
				"$ref": "#/$defs/anyAttribute"
			}
		},
		"classArtefact": {
			"type": "object",
			"description": "A standalone published OOML class artefact.",
			"properties": {
				"ooml": {
					"$ref": "#/$defs/semver",
					"description": "OOML specification version this artefact targets."
				},
				"fqn": {
					"$ref": "#/$defs/classFqn",
					"description": "Fully qualified name and version of this class."
				},
				"name": {
					"$ref": "#/$defs/nonEmptyString",
					"description": "Free-form human-readable label for this class."
				},
				"description": {
					"$ref": "#/$defs/nonEmptyString",
					"description": "Human-readable purpose of this class."
				},
				"authors": {
					"$ref": "#/$defs/authors"
				},
				"license": {
					"type": "string",
					"minLength": 1
				},
				"extends": {
					"$ref": "#/$defs/extendsValue"
				},
				"abstract": {
					"type": "boolean"
				},
				"final": {
					"type": "boolean"
				},
				"deprecated": {
					"$ref": "#/$defs/nonEmptyString"
				},
				"metadata": {
					"$ref": "#/$defs/metadataObject"
				},
				"attributes": {
					"$ref": "#/$defs/attributesObject"
				},
				"use": {
					"$ref": "#/$defs/useObject"
				}
			},
			"required": [
				"ooml",
				"fqn",
				"name"
			],
			"additionalProperties": false,
			"not": {
				"description": "Rule S08: a class must not be both abstract and final.",
				"properties": {
					"abstract": {
						"const": true
					},
					"final": {
						"const": true
					}
				},
				"required": [
					"abstract",
					"final"
				]
			}
		},
		"globalAttrArtefact": {
			"type": "object",
			"description": "A standalone published OOML global attribute artefact.",
			"properties": {
				"ooml": {
					"$ref": "#/$defs/semver",
					"description": "OOML specification version this artefact targets."
				},
				"fqn": {
					"$ref": "#/$defs/globalAttrFqn",
					"description": "Fully qualified name and version of this global attribute."
				},
				"name": {
					"$ref": "#/$defs/nonEmptyString",
					"description": "Free-form human-readable label for this global attribute."
				},
				"description": {
					"$ref": "#/$defs/nonEmptyString",
					"description": "Human-readable purpose of this global attribute."
				},
				"authors": {
					"$ref": "#/$defs/authors"
				},
				"license": {
					"type": "string",
					"minLength": 1
				},
				"kind": {
					"$ref": "#/$defs/attributeKind"
				},
				"type": {
					"description": "Value type: primitive name or class/global attribute FQN range.",
					"oneOf": [
						{
							"$ref": "#/$defs/primitiveTypeName"
						},
						{
							"$ref": "#/$defs/classFqnRange"
						},
						{
							"$ref": "#/$defs/globalAttrFqnRange"
						}
					]
				},
				"minLength": {
					"type": "integer",
					"minimum": 0
				},
				"maxLength": {
					"type": "integer",
					"minimum": 0
				},
				"pattern": {
					"type": "string"
				},
				"minimum": {
					"type": "number"
				},
				"maximum": {
					"type": "number"
				},
				"exclusiveMinimum": {
					"type": "number"
				},
				"exclusiveMaximum": {
					"type": "number"
				},
				"precision": {
					"type": "integer",
					"minimum": 1
				},
				"scale": {
					"type": "integer",
					"minimum": 0
				},
				"encoding": {
					"type": "string"
				},
				"valueKind": {
					"$ref": "#/$defs/collectionValueKind"
				},
				"valueType": {
					"$ref": "#/$defs/collectionValueType"
				},
				"keyKind": {
					"$ref": "#/$defs/collectionValueKind"
				},
				"keyType": {
					"$ref": "#/$defs/collectionValueType"
				},
				"minItems": {
					"type": "integer",
					"minimum": 0
				},
				"maxItems": {
					"type": "integer",
					"minimum": 0
				},
				"deprecated": {
					"$ref": "#/$defs/nonEmptyString"
				},
				"metadata": {
					"$ref": "#/$defs/metadataObject"
				},
				"attributes": {
					"$ref": "#/$defs/attributesObject",
					"description": "Map of sub-attribute identifier to sub-attribute definition. Only meaningful (and required) when kind is 'nested'."
				}
			},
			"required": [
				"ooml",
				"fqn",
				"name",
				"kind"
			],
			"additionalProperties": false
		},
		"nestedAttribute": {
			"description": "An attribute of kind 'nested': an ad hoc, locally-scoped data structure with no independent identity, described inline by its own 'attributes' property. Supports arbitrary nesting depth via recursion.",
			"allOf": [
				{
					"$ref": "#/$defs/commonAttributeProperties"
				},
				{
					"type": "object",
					"properties": {
						"kind": {
							"const": "nested"
						},
						"attributes": {
							"$ref": "#/$defs/attributesObject",
							"minProperties": 1
						},
						"name": {},
						"description": {},
						"required": {},
						"nullable": {},
						"static": {},
						"value": {},
						"local": {},
						"final": {},
						"deprecated": {}
					},
					"required": [
						"kind",
						"attributes"
					],
					"additionalProperties": false
				}
			]
		},
		"collectionKeyKind": {
			"type": "string",
			"description": "Kind of map keys. Excludes 'nested': a map key must have well-defined equality for lookup.",
			"enum": [
				"primitive",
				"object",
				"class",
				"enum",
				"attribute"
			]
		},
		"collectionKeyType": {
			"description": "Shape of map keys: primitive name, class FQN range, or global attribute FQN range. Never an inline sub-attribute map, since keys cannot be nested.",
			"oneOf": [
				{
					"$ref": "#/$defs/primitiveTypeName"
				},
				{
					"$ref": "#/$defs/classFqnRange"
				},
				{
					"$ref": "#/$defs/globalAttrFqnRange"
				}
			]
		},
		"useKey": {
			"type": "string",
			"description": "Either a bare camelCase attribute identifier (valid only when currently unambiguous on the class) or an FQN range picking one attribute out from under a name collision.",
			"oneOf": [
				{
					"$ref": "#/$defs/attributeIdentifier"
				},
				{
					"$ref": "#/$defs/classFqnRange"
				},
				{
					"$ref": "#/$defs/globalAttrFqnRange"
				}
			]
		},
		"overrideProperties": {
			"type": "object",
			"description": "Properties that MAY be overridden on an inherited attribute (via use.override) or an imported global attribute (as direct siblings, \u00a79.9). Only this closed set is permitted (rule U04); each must also be applicable to the target attribute's actual kind (rule U04a).",
			"properties": {
				"name": {
					"type": "string",
					"minLength": 1
				},
				"description": {
					"type": "string",
					"minLength": 1
				},
				"minLength": {
					"type": "integer",
					"minimum": 0
				},
				"maxLength": {
					"type": "integer",
					"minimum": 0
				},
				"minimum": {
					"type": "number"
				},
				"maximum": {
					"type": "number"
				},
				"exclusiveMinimum": {
					"type": "number"
				},
				"exclusiveMaximum": {
					"type": "number"
				},
				"precision": {
					"type": "integer",
					"minimum": 1
				},
				"scale": {
					"type": "integer",
					"minimum": 0
				},
				"minItems": {
					"type": "integer",
					"minimum": 0
				},
				"maxItems": {
					"type": "integer",
					"minimum": 0
				},
				"required": {
					"type": "boolean"
				},
				"nullable": {
					"type": "boolean"
				},
				"pattern": {
					"type": "string"
				},
				"deprecated": {
					"type": "string",
					"minLength": 1
				},
				"value": {}
			},
			"additionalProperties": false
		},
		"useEntry": {
			"type": "object",
			"description": "A single use entry: renames the target attribute (as), adjusts its override-eligible properties (override), or both. At least one MUST be present (rule U02).",
			"properties": {
				"as": {
					"$ref": "#/$defs/attributeIdentifier"
				},
				"override": {
					"$ref": "#/$defs/overrideProperties"
				}
			},
			"anyOf": [
				{
					"required": [
						"as"
					]
				},
				{
					"required": [
						"override"
					]
				}
			],
			"additionalProperties": false
		},
		"useObject": {
			"type": "object",
			"description": "Use: keys identify an inherited attribute (bare name or FQN range, \u00a712.2); values describe how to rename and/or override it.",
			"propertyNames": {
				"$ref": "#/$defs/useKey"
			},
			"additionalProperties": {
				"$ref": "#/$defs/useEntry"
			}
		}
	},
	"oneOf": [
		{
			"description": "A standalone class artefact (has 'fqn', no 'kind' at top level).",
			"$ref": "#/$defs/classArtefact",
			"required": [
				"ooml",
				"fqn",
				"name"
			],
			"properties": {
				"namespace": false
			}
		},
		{
			"description": "A standalone global attribute artefact (has 'fqn' and top-level 'kind').",
			"$ref": "#/$defs/globalAttrArtefact",
			"required": [
				"ooml",
				"fqn",
				"name",
				"kind"
			],
			"properties": {
				"namespace": false
			}
		}
	]
}
