version: 1
project_id: example-product-ontology
root_ontology: https://example.org/ontology
# '.' is the directory that contains .protege-mcp/ (or the policy's own directory elsewhere),
# so ontology.ttl and modules/ sit beside .protege-mcp/, not inside it.
project_root: .

interoperability:
  profile: https://hakjuoh.github.io/protege-mcp/profiles/project-v1/
  additional_profiles: []
  root_artifact: ontology.ttl
  metadata:
    path: ro-crate-metadata.json
    format: ro-crate-1.1
  canonicalization:
    algorithm: RDFC-1.0
    hash: SHA-256
    scope: root-ontology
    timeout_ms: 120000

prefixes:
  ex: https://example.org/ontology/
  dcterms: http://purl.org/dc/terms/
  rdfs: http://www.w3.org/2000/01/rdf-schema#
  skos: http://www.w3.org/2004/02/skos/core#

entity_search:
  preferred_properties: [rdfs:label, skos:prefLabel]
  synonym_properties: [skos:altLabel]
  preferred_languages: [en]
  fallback_languages: [und]

filesystem:
  allow_external_paths: false
audit:
  retention_days: 90
  max_file_bytes: 10485760
  max_files: 10
network:
  default: deny
  allowed_hosts: []

modules:
  - ontology_iri: https://example.org/ontology
    path: ontology.ttl
    owned_namespaces:
      - https://example.org/ontology/
  - ontology_iri: https://example.org/ontology/core
    path: modules/core.ttl
    owned_namespaces:
      - https://example.org/ontology/

reasoning:
  reasoner: HermiT
  owl_profile: DL
  required: true
  timeout_ms: 120000

annotations:
  labels:
    properties: [rdfs:label]
    required_languages: [en]
    one_preferred_per_language: true
  definitions:
    properties: [skos:definition]
    required: true
    required_languages: [en]
  required: [dcterms:source]

iri_policy:
  required_namespaces:
    - https://example.org/ontology/
  pattern: '^https://example[.]org/ontology/[A-Z][A-Za-z0-9_]+$'

lifecycle:
  status_property: ex:status
  allowed_values: [active, deprecated]
  deprecated_values: [deprecated]
  replaced_by_properties: [dcterms:isReplacedBy]
  require_replacement: true

imports:
  mode: locked
  fail_on_missing: true
  lockfile: imports.lock.json
  network: deny

validation:
  required_stages: [interoperability, reasoner, profile, governance, structural, invariants, cqs, shacl]
  fail_on: warning
  structural:
    disabled: [property_missing_domain, property_missing_range]
    severity_overrides: {}
  invariants:
    paths: [quality/invariants/*.rq]
  shacl:
    paths: [quality/shapes.ttl]
  competency_questions:
    convention: robot-sparql-dir
    path: cqs
  waivers: []

release:
  format: turtle
  output_dir: dist
  require_version_iri: true
  require_clean_round_trip: true
