@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:    <http://www.w3.org/2002/07/owl#> .
@prefix xsd:    <http://www.w3.org/2001/XMLSchema#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix prov:   <http://www.w3.org/ns/prov#> .
@prefix spdx:   <http://spdx.org/rdf/terms#> .
@prefix ao:   <https://arnwaldn.github.io/agent-owl/ontology/audit#> .

# =============================================================================
# Agent Owl Audit Ontology v3.1
# Cryptographic integrity tracking + provenance for project file management
# EU AI Act (Reg. 2024/1689) compliance extensions
# OWL 2 DL compliant
# =============================================================================

<https://arnwaldn.github.io/agent-owl/ontology/audit> a owl:Ontology ;
    owl:versionIRI <https://arnwaldn.github.io/agent-owl/ontology/audit-3.1> ;
    owl:versionInfo "3.1.0" ;
    dcterms:title "Agent Owl Audit Ontology"@fr ;
    dcterms:description "Ontologie de traçabilité cryptographique, d'audit continu et de conformité AI Act (Rég. EU 2024/1689)."@fr ;
    dcterms:creator "Arnaud Porcel" ;
    dcterms:created "2026-02-17"^^xsd:date ;
    dcterms:modified "2026-08-04"^^xsd:date ;
    owl:imports <http://www.w3.org/ns/prov#> .

# =============================================================================
# CLASSES
# =============================================================================

# --- Core entities ---

ao:File a owl:Class ;
    rdfs:label "Fichier"@fr ;
    rdfs:comment "Tout fichier suivi par Agent Owl."@fr ;
    rdfs:subClassOf prov:Entity .

ao:FileVersion a owl:Class ;
    rdfs:label "Version de fichier"@fr ;
    rdfs:comment "Instantané immuable d'un fichier à un moment donné, identifié par son hash."@fr ;
    rdfs:subClassOf prov:Entity .

ao:AuditEvent a owl:Class ;
    rdfs:label "Événement d'audit"@fr ;
    rdfs:comment "Enregistrement atomique d'un événement détecté par l'agent."@fr ;
    rdfs:subClassOf prov:Activity .

ao:Agent a owl:Class ;
    rdfs:label "Agent"@fr ;
    rdfs:comment "Entité ayant déclenché ou détecté l'événement (humain, script, CI/CD)."@fr ;
    rdfs:subClassOf prov:Agent .

ao:HashDigest a owl:Class ;
    rdfs:label "Empreinte cryptographique"@fr ;
    rdfs:comment "Valeur de hash avec son algorithme. Immuable."@fr .

# --- Organizational context ---

ao:Project a owl:Class ;
    rdfs:label "Projet"@fr ;
    rdfs:comment "Projet client ou interne."@fr .

ao:Client a owl:Class ;
    rdfs:label "Client"@fr ;
    rdfs:comment "Client pour lequel un projet est mené."@fr .

ao:FileCategory a owl:Class ;
    rdfs:label "Catégorie de fichier"@fr ;
    rdfs:comment "Classification fonctionnelle : contrat, facture, livrable, spec, etc."@fr .

# --- EU AI Act (Rég. 2024/1689) ---

ao:AISystem a owl:Class ;
    rdfs:label "Système d'IA"@fr ;
    rdfs:comment "Système d'intelligence artificielle au sens du Règlement européen sur l'IA (Art. 3)."@fr ;
    rdfs:subClassOf prov:Entity .

ao:Dataset a owl:Class ;
    rdfs:label "Jeu de données"@fr ;
    rdfs:comment "Jeu de données utilisé pour l'entraînement, la validation ou le test (Art. 10)."@fr ;
    rdfs:subClassOf prov:Entity .

ao:ModelVersion a owl:Class ;
    rdfs:label "Version de modèle"@fr ;
    rdfs:comment "Version spécifique d'un modèle d'IA avec ses métriques de performance (Art. 11)."@fr ;
    rdfs:subClassOf prov:Entity .

ao:ConformityAssessment a owl:Class ;
    rdfs:label "Évaluation de conformité"@fr ;
    rdfs:comment "Évaluation de conformité du système d'IA (Art. 43)."@fr ;
    rdfs:subClassOf prov:Activity .

ao:HumanOversightAction a owl:Class ;
    rdfs:label "Action de supervision humaine"@fr ;
    rdfs:comment "Intervention humaine dans le cycle de vie du système d'IA (Art. 14)."@fr ;
    rdfs:subClassOf prov:Activity .

ao:Incident a owl:Class ;
    rdfs:label "Incident"@fr ;
    rdfs:comment "Incident impliquant un système d'IA à haut risque (Art. 73)."@fr ;
    rdfs:subClassOf prov:Activity .

ao:IncidentReport a owl:Class ;
    rdfs:label "Rapport d'incident"@fr ;
    rdfs:comment "Rapport officiel d'un incident grave adressé aux autorités de surveillance du marché (Art. 73, para. 1)."@fr ;
    rdfs:subClassOf prov:Entity .

ao:RiskAssessment a owl:Class ;
    rdfs:label "Évaluation des risques"@fr ;
    rdfs:comment "Évaluation systématique des risques du système d'IA (Art. 9)."@fr ;
    rdfs:subClassOf prov:Activity .

ao:Risk a owl:Class ;
    rdfs:label "Risque"@fr ;
    rdfs:comment "Risque identifié pour un système d'IA (Art. 9, para. 2)."@fr .

ao:MitigationMeasure a owl:Class ;
    rdfs:label "Mesure d'atténuation"@fr ;
    rdfs:comment "Mesure adoptée pour atténuer un risque identifié (Art. 9, para. 4)."@fr .

# --- Integrity ---

ao:IntegrityStatus a owl:Class ;
    rdfs:label "Statut d'intégrité"@fr ;
    rdfs:comment "Résultat de la vérification d'intégrité."@fr .

ao:AlertLevel a owl:Class ;
    rdfs:label "Niveau d'alerte"@fr ;
    rdfs:comment "Criticité d'un événement d'audit."@fr .

# =============================================================================
# EVENT TYPE ENUMERATION (owl:oneOf)
# =============================================================================

ao:EventType a owl:Class ;
    rdfs:label "Type d'événement"@fr ;
    owl:oneOf (
        ao:FileCreated
        ao:FileModified
        ao:FileDeleted
        ao:FileRenamed
        ao:FileMoved
        ao:IntegrityVerified
        ao:IntegrityViolation
        ao:HashComputed
        ao:PeriodicScan
        ao:BaselineEstablished
    ) .

ao:FileCreated a ao:EventType ; rdfs:label "Création"@fr .
ao:FileModified a ao:EventType ; rdfs:label "Modification"@fr .
ao:FileDeleted a ao:EventType ; rdfs:label "Suppression"@fr .
ao:FileRenamed a ao:EventType ; rdfs:label "Renommage"@fr .
ao:FileMoved a ao:EventType ; rdfs:label "Déplacement"@fr .
ao:IntegrityVerified a ao:EventType ; rdfs:label "Intégrité vérifiée"@fr .
ao:IntegrityViolation a ao:EventType ; rdfs:label "Violation d'intégrité"@fr .
ao:HashComputed a ao:EventType ; rdfs:label "Hash calculé"@fr .
ao:PeriodicScan a ao:EventType ; rdfs:label "Scan périodique"@fr .
ao:BaselineEstablished a ao:EventType ; rdfs:label "Baseline établie"@fr .

# --- Integrity status individuals ---

ao:Verified a ao:IntegrityStatus ; rdfs:label "Vérifié"@fr .
ao:Tampered a ao:IntegrityStatus ; rdfs:label "Altéré"@fr .
ao:Unknown a ao:IntegrityStatus ; rdfs:label "Inconnu"@fr .
ao:Deleted a ao:IntegrityStatus ; rdfs:label "Supprimé"@fr .
ao:New a ao:IntegrityStatus ; rdfs:label "Nouveau"@fr .

# --- Alert levels ---

ao:Critical a ao:AlertLevel ; rdfs:label "Critique"@fr .
ao:Warning a ao:AlertLevel ; rdfs:label "Avertissement"@fr .
ao:Info a ao:AlertLevel ; rdfs:label "Information"@fr .

# --- Risk level (Art. 6) ---

ao:RiskLevel a owl:Class ;
    rdfs:label "Niveau de risque"@fr ;
    rdfs:comment "Classification du niveau de risque d'un système d'IA selon l'AI Act."@fr ;
    owl:oneOf (
        ao:Unacceptable
        ao:HighRisk
        ao:LimitedRisk
        ao:MinimalRisk
    ) .

ao:Unacceptable a ao:RiskLevel ; rdfs:label "Inacceptable"@fr .
ao:HighRisk a ao:RiskLevel ; rdfs:label "Risque élevé"@fr .
ao:LimitedRisk a ao:RiskLevel ; rdfs:label "Risque limité"@fr .
ao:MinimalRisk a ao:RiskLevel ; rdfs:label "Risque minimal"@fr .

# --- Compliance status ---

ao:ComplianceStatus a owl:Class ;
    rdfs:label "Statut de conformité"@fr ;
    rdfs:comment "Statut de conformité d'un système d'IA au regard du Règlement EU 2024/1689."@fr ;
    owl:oneOf (
        ao:Compliant
        ao:NonCompliant
        ao:CompliancePending
        ao:UnderReview
    ) .

ao:Compliant a ao:ComplianceStatus ; rdfs:label "Conforme"@fr .
ao:NonCompliant a ao:ComplianceStatus ; rdfs:label "Non conforme"@fr .
ao:CompliancePending a ao:ComplianceStatus ; rdfs:label "En attente"@fr .
ao:UnderReview a ao:ComplianceStatus ; rdfs:label "En cours d'examen"@fr .

# --- Lifecycle phase ---

ao:LifecyclePhase a owl:Class ;
    rdfs:label "Phase du cycle de vie"@fr ;
    rdfs:comment "Phase du cycle de vie d'un système d'IA."@fr ;
    owl:oneOf (
        ao:PhaseDevelopment
        ao:PhaseDeployment
        ao:PhaseOperation
        ao:PhasePostMarket
        ao:PhaseRetired
    ) .

ao:PhaseDevelopment a ao:LifecyclePhase ; rdfs:label "Développement"@fr .
ao:PhaseDeployment a ao:LifecyclePhase ; rdfs:label "Déploiement"@fr .
ao:PhaseOperation a ao:LifecyclePhase ; rdfs:label "Opération"@fr .
ao:PhasePostMarket a ao:LifecyclePhase ; rdfs:label "Post-marché"@fr .
ao:PhaseRetired a ao:LifecyclePhase ; rdfs:label "Retiré"@fr .

# --- Incident severity (Art. 73) ---

ao:IncidentSeverity a owl:Class ;
    rdfs:label "Sévérité de l'incident"@fr ;
    rdfs:comment "Niveau de gravité d'un incident impliquant un système d'IA."@fr ;
    owl:oneOf (
        ao:SeverityCritical
        ao:SeverityHigh
        ao:SeverityMedium
        ao:SeverityLow
    ) .

ao:SeverityCritical a ao:IncidentSeverity ; rdfs:label "Critique"@fr .
ao:SeverityHigh a ao:IncidentSeverity ; rdfs:label "Élevé"@fr .
ao:SeverityMedium a ao:IncidentSeverity ; rdfs:label "Moyen"@fr .
ao:SeverityLow a ao:IncidentSeverity ; rdfs:label "Faible"@fr .

# =============================================================================
# OBJECT PROPERTIES
# =============================================================================

# --- File relationships ---

ao:hasVersion a owl:ObjectProperty ;
    rdfs:label "a pour version"@fr ;
    rdfs:domain ao:File ;
    rdfs:range ao:FileVersion .

ao:previousVersion a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "version précédente"@fr ;
    rdfs:domain ao:FileVersion ;
    rdfs:range ao:FileVersion ;
    rdfs:comment "Chaîne de provenance versionnée. Fonctionnelle : une version n'a qu'un seul prédécesseur."@fr .

ao:currentVersion a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "version courante"@fr ;
    rdfs:domain ao:File ;
    rdfs:range ao:FileVersion .

# --- Hash ---

ao:hasHash a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "a pour hash"@fr ;
    rdfs:domain ao:FileVersion ;
    rdfs:range ao:HashDigest .

# --- Audit event relationships ---

ao:hasEventType a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "type d'événement"@fr ;
    rdfs:domain ao:AuditEvent ;
    rdfs:range ao:EventType .

ao:concernsFile a owl:ObjectProperty ;
    rdfs:label "concerne le fichier"@fr ;
    rdfs:domain ao:AuditEvent ;
    rdfs:range ao:File .

ao:concernsVersion a owl:ObjectProperty ;
    rdfs:label "concerne la version"@fr ;
    rdfs:domain ao:AuditEvent ;
    rdfs:range ao:FileVersion .

ao:detectedBy a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "détecté par"@fr ;
    rdfs:domain ao:AuditEvent ;
    rdfs:range ao:Agent ;
    rdfs:subPropertyOf prov:wasAssociatedWith .

ao:hasIntegrityStatus a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "statut d'intégrité"@fr ;
    rdfs:domain ao:AuditEvent ;
    rdfs:range ao:IntegrityStatus .

ao:hasAlertLevel a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "niveau d'alerte"@fr ;
    rdfs:domain ao:AuditEvent ;
    rdfs:range ao:AlertLevel .

# --- Organizational ---

ao:belongsToProject a owl:ObjectProperty ;
    rdfs:label "appartient au projet"@fr ;
    rdfs:domain ao:File ;
    rdfs:range ao:Project .

ao:hasClient a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "a pour client"@fr ;
    rdfs:domain ao:Project ;
    rdfs:range ao:Client .

ao:hasCategory a owl:ObjectProperty ;
    rdfs:label "a pour catégorie"@fr ;
    rdfs:domain ao:File ;
    rdfs:range ao:FileCategory .

# --- AI System relationships (AI Act) ---

ao:belongsToAISystem a owl:ObjectProperty ;
    rdfs:label "appartient au système d'IA"@fr ;
    rdfs:domain ao:File ;
    rdfs:range ao:AISystem .

ao:hasRiskLevel a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "niveau de risque"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range ao:RiskLevel .

ao:hasComplianceStatus a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "statut de conformité"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range ao:ComplianceStatus .

ao:hasLifecyclePhase a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "phase du cycle de vie"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range ao:LifecyclePhase .

ao:hasOversightAction a owl:ObjectProperty ;
    rdfs:label "a pour action de supervision"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range ao:HumanOversightAction .

# --- Model & Data governance (Art. 11, 17) ---

ao:hasModelVersion a owl:ObjectProperty ;
    rdfs:label "a pour version de modèle"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range ao:ModelVersion .

ao:currentModelVersion a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "version courante du modèle"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range ao:ModelVersion .

ao:hasTrainingData a owl:ObjectProperty ;
    rdfs:label "données d'entraînement"@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range ao:Dataset .

ao:hasValidationData a owl:ObjectProperty ;
    rdfs:label "données de validation"@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range ao:Dataset .

ao:hasTestData a owl:ObjectProperty ;
    rdfs:label "données de test"@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range ao:Dataset .

ao:hasConformityAssessment a owl:ObjectProperty ;
    rdfs:label "a pour évaluation de conformité"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range ao:ConformityAssessment .

# --- Incident management (Art. 73) ---

ao:involvesSystem a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "implique le système"@fr ;
    rdfs:domain ao:Incident ;
    rdfs:range ao:AISystem .

ao:hasIncidentSeverity a owl:ObjectProperty, owl:FunctionalProperty ;
    rdfs:label "sévérité de l'incident"@fr ;
    rdfs:domain ao:Incident ;
    rdfs:range ao:IncidentSeverity .

ao:hasIncidentReport a owl:ObjectProperty ;
    rdfs:label "a pour rapport d'incident"@fr ;
    rdfs:domain ao:Incident ;
    rdfs:range ao:IncidentReport .

# --- Risk management (Art. 9) ---

ao:hasRiskAssessment a owl:ObjectProperty ;
    rdfs:label "a pour évaluation des risques"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range ao:RiskAssessment .

ao:identifiesRisk a owl:ObjectProperty ;
    rdfs:label "identifie le risque"@fr ;
    rdfs:domain ao:RiskAssessment ;
    rdfs:range ao:Risk .

ao:hasMitigation a owl:ObjectProperty ;
    rdfs:label "a pour mesure d'atténuation"@fr ;
    rdfs:domain ao:Risk ;
    rdfs:range ao:MitigationMeasure .

ao:mitigatesRisk a owl:ObjectProperty ;
    rdfs:label "atténue le risque"@fr ;
    rdfs:domain ao:MitigationMeasure ;
    rdfs:range ao:Risk .

# =============================================================================
# DATATYPE PROPERTIES
# =============================================================================

ao:filePath a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "chemin du fichier"@fr ;
    rdfs:domain ao:File ;
    rdfs:range xsd:string .

ao:fileName a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "nom du fichier"@fr ;
    rdfs:domain ao:File ;
    rdfs:range xsd:string .

ao:fileExtension a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "extension"@fr ;
    rdfs:domain ao:File ;
    rdfs:range xsd:string .

ao:fileSizeBytes a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "taille en octets"@fr ;
    rdfs:domain ao:FileVersion ;
    rdfs:range xsd:long .

ao:mimeType a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "type MIME"@fr ;
    rdfs:domain ao:FileVersion ;
    rdfs:range xsd:string .

ao:hashValue a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "valeur du hash"@fr ;
    rdfs:domain ao:HashDigest ;
    rdfs:range xsd:hexBinary .

ao:hashAlgorithm a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "algorithme de hash"@fr ;
    rdfs:domain ao:HashDigest ;
    rdfs:range xsd:string .

ao:timestamp a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "horodatage"@fr ;
    rdfs:domain ao:AuditEvent ;
    rdfs:range xsd:dateTime .

ao:versionTimestamp a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "horodatage de version"@fr ;
    rdfs:domain ao:FileVersion ;
    rdfs:range xsd:dateTime .

ao:versionNumber a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "numéro de version"@fr ;
    rdfs:domain ao:FileVersion ;
    rdfs:range xsd:positiveInteger .

ao:eventDescription a owl:DatatypeProperty ;
    rdfs:label "description de l'événement"@fr ;
    rdfs:domain ao:AuditEvent ;
    rdfs:range xsd:string .

ao:agentName a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "nom de l'agent"@fr ;
    rdfs:domain ao:Agent ;
    rdfs:range xsd:string .

ao:agentType a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "type d'agent"@fr ;
    rdfs:comment "Valeurs : 'daemon', 'manual', 'ci-cd', 'claude-code'"@fr ;
    rdfs:domain ao:Agent ;
    rdfs:range xsd:string .

ao:projectName a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "nom du projet"@fr ;
    rdfs:domain ao:Project ;
    rdfs:range xsd:string .

ao:clientName a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "nom du client"@fr ;
    rdfs:domain ao:Client ;
    rdfs:range xsd:string .

ao:categoryName a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "nom de catégorie"@fr ;
    rdfs:domain ao:FileCategory ;
    rdfs:range xsd:string .

# --- AI System datatype properties ---

ao:systemName a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "nom du système"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

ao:systemDescription a owl:DatatypeProperty ;
    rdfs:label "description du système"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

ao:intendedPurpose a owl:DatatypeProperty ;
    rdfs:label "finalité prévue"@fr ;
    rdfs:comment "Usage prévu du système d'IA (Art. 13)."@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

ao:providerName a owl:DatatypeProperty ;
    rdfs:label "nom du fournisseur"@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

ao:retentionMinMonths a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "rétention minimale en mois"@fr ;
    rdfs:comment "Durée minimale de conservation des journaux générés automatiquement (Art. 19 : au moins 6 mois). L'Art. 12 régit la capacité de journalisation, pas sa durée."@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:positiveInteger .

# --- Dataset properties ---

ao:datasetName a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "nom du jeu de données"@fr ;
    rdfs:domain ao:Dataset ;
    rdfs:range xsd:string .

ao:datasetDescription a owl:DatatypeProperty ;
    rdfs:label "description du jeu de données"@fr ;
    rdfs:domain ao:Dataset ;
    rdfs:range xsd:string .

ao:datasetSize a owl:DatatypeProperty ;
    rdfs:label "taille du jeu de données"@fr ;
    rdfs:comment "Nombre d'échantillons dans le jeu de données."@fr ;
    rdfs:domain ao:Dataset ;
    rdfs:range xsd:long .

# --- Model version properties ---

ao:modelVersionTag a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "tag de version du modèle"@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:string .

ao:modelTrainedAt a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "date d'entraînement"@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:dateTime .

ao:performanceMetrics a owl:DatatypeProperty ;
    rdfs:label "métriques de performance"@fr ;
    rdfs:comment "Métriques sérialisées en JSON (accuracy, F1, etc.)."@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:string .

# --- Conformity assessment properties ---

ao:assessorName a owl:DatatypeProperty ;
    rdfs:label "nom de l'évaluateur"@fr ;
    rdfs:domain ao:ConformityAssessment ;
    rdfs:range xsd:string .

ao:assessmentDate a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "date d'évaluation"@fr ;
    rdfs:domain ao:ConformityAssessment ;
    rdfs:range xsd:dateTime .

ao:assessmentResult a owl:DatatypeProperty ;
    rdfs:label "résultat de l'évaluation"@fr ;
    rdfs:domain ao:ConformityAssessment ;
    rdfs:range xsd:string .

# --- Human oversight properties ---

ao:oversightDescription a owl:DatatypeProperty ;
    rdfs:label "description de la supervision"@fr ;
    rdfs:domain ao:HumanOversightAction ;
    rdfs:range xsd:string .

ao:oversightTimestamp a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "horodatage de supervision"@fr ;
    rdfs:domain ao:HumanOversightAction ;
    rdfs:range xsd:dateTime .

ao:oversightActor a owl:DatatypeProperty ;
    rdfs:label "acteur de supervision"@fr ;
    rdfs:domain ao:HumanOversightAction ;
    rdfs:range xsd:string .

# --- Incident properties ---

ao:incidentId a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "identifiant de l'incident"@fr ;
    rdfs:domain ao:Incident ;
    rdfs:range xsd:string .

ao:incidentDescription a owl:DatatypeProperty ;
    rdfs:label "description de l'incident"@fr ;
    rdfs:domain ao:Incident ;
    rdfs:range xsd:string .

ao:incidentTimestamp a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "horodatage de l'incident"@fr ;
    rdfs:domain ao:Incident ;
    rdfs:range xsd:dateTime .

ao:reportingDeadline a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "date limite de déclaration"@fr ;
    rdfs:comment "Date limite de déclaration initiale de l'incident grave (Art. 73). Le délai court à compter de la prise de connaissance par le fournisseur ou, le cas échéant, le déployeur : 15 jours en régime général (para. 2), 10 jours en cas de décès d'une personne (para. 4), 2 jours en cas d'infraction généralisée ou de perturbation grave et irréversible d'une infrastructure critique (para. 3)."@fr ;
    rdfs:domain ao:Incident ;
    rdfs:range xsd:dateTime .

# --- Risk properties ---

ao:riskId a owl:DatatypeProperty, owl:FunctionalProperty ;
    rdfs:label "identifiant du risque"@fr ;
    rdfs:domain ao:Risk ;
    rdfs:range xsd:string .

ao:riskDescription a owl:DatatypeProperty ;
    rdfs:label "description du risque"@fr ;
    rdfs:domain ao:Risk ;
    rdfs:range xsd:string .

ao:residualRiskLevel a owl:DatatypeProperty ;
    rdfs:label "niveau de risque résiduel"@fr ;
    rdfs:comment "Niveau de risque restant après application des mesures d'atténuation."@fr ;
    rdfs:domain ao:Risk ;
    rdfs:range xsd:string .

# --- Mitigation properties ---

ao:mitigationDescription a owl:DatatypeProperty ;
    rdfs:label "description de la mesure"@fr ;
    rdfs:domain ao:MitigationMeasure ;
    rdfs:range xsd:string .

ao:mitigationStatus a owl:DatatypeProperty ;
    rdfs:label "statut de la mesure"@fr ;
    rdfs:domain ao:MitigationMeasure ;
    rdfs:range xsd:string .

# =============================================================================
# ANNEX IV — Technical Documentation (Reg. 2024/1689)
# =============================================================================

# --- Point 1 : General description of the AI system ---

ao:annexIV_generalDescription a owl:DatatypeProperty ;
    rdfs:label "description générale (Annexe IV, pt. 1)"@fr ;
    rdfs:comment "Description générale du système d'IA incluant sa finalité, son fonctionnement et ses interactions."@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

# --- Point 2 : Components and interaction ---

ao:annexIV_componentDescription a owl:DatatypeProperty ;
    rdfs:label "description des composants (Annexe IV, pt. 2)"@fr ;
    rdfs:comment "Description détaillée des composants du système et de leur interaction."@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

ao:annexIV_hardwareRequirements a owl:DatatypeProperty ;
    rdfs:label "exigences matérielles (Annexe IV, pt. 2)"@fr ;
    rdfs:comment "Ressources matérielles nécessaires au fonctionnement du système."@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

# --- Point 3 : Development process ---

ao:annexIV_developmentProcess a owl:DatatypeProperty ;
    rdfs:label "processus de développement (Annexe IV, pt. 3)"@fr ;
    rdfs:comment "Description du processus de développement, y compris les méthodes et techniques utilisées."@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

ao:annexIV_designChoices a owl:DatatypeProperty ;
    rdfs:label "choix de conception (Annexe IV, pt. 3)"@fr ;
    rdfs:comment "Principales décisions de conception et justifications."@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:string .

ao:annexIV_computationalResources a owl:DatatypeProperty ;
    rdfs:label "ressources de calcul (Annexe IV, pt. 3)"@fr ;
    rdfs:comment "Ressources de calcul utilisées pour le développement et l'entraînement."@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:string .

# --- Point 4 : Capabilities and limitations ---

ao:annexIV_performanceDescription a owl:DatatypeProperty ;
    rdfs:label "description des performances (Annexe IV, pt. 4)"@fr ;
    rdfs:comment "Niveaux de performance attendus, y compris pour des groupes spécifiques."@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:string .

ao:annexIV_knownLimitations a owl:DatatypeProperty ;
    rdfs:label "limites connues (Annexe IV, pt. 4)"@fr ;
    rdfs:comment "Limites connues et conditions de sous-performance prévisibles."@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:string .

ao:annexIV_foreseeMisuse a owl:DatatypeProperty ;
    rdfs:label "mésusages prévisibles (Annexe IV, pt. 4)"@fr ;
    rdfs:comment "Utilisations abusives raisonnablement prévisibles du système."@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

# --- Point 5 : Data governance (Art. 10) ---

ao:annexIV_dataGovernance a owl:DatatypeProperty ;
    rdfs:label "gouvernance des données (Annexe IV, pt. 5)"@fr ;
    rdfs:comment "Description des pratiques de gouvernance des données utilisées."@fr ;
    rdfs:domain ao:Dataset ;
    rdfs:range xsd:string .

ao:annexIV_dataPreparation a owl:DatatypeProperty ;
    rdfs:label "préparation des données (Annexe IV, pt. 5)"@fr ;
    rdfs:comment "Opérations de prétraitement : annotation, nettoyage, enrichissement."@fr ;
    rdfs:domain ao:Dataset ;
    rdfs:range xsd:string .

ao:annexIV_dataOrigin a owl:DatatypeProperty ;
    rdfs:label "origine des données (Annexe IV, pt. 5)"@fr ;
    rdfs:comment "Provenance et source des données d'entraînement, validation, test."@fr ;
    rdfs:domain ao:Dataset ;
    rdfs:range xsd:string .

ao:annexIV_dataBiasAssessment a owl:DatatypeProperty ;
    rdfs:label "évaluation des biais (Annexe IV, pt. 5)"@fr ;
    rdfs:comment "Analyse des biais potentiels dans les données et mesures correctives."@fr ;
    rdfs:domain ao:Dataset ;
    rdfs:range xsd:string .

# --- Point 6 : Human oversight (Art. 14) ---

ao:annexIV_oversightMeasures a owl:DatatypeProperty ;
    rdfs:label "mesures de supervision humaine (Annexe IV, pt. 6)"@fr ;
    rdfs:comment "Mesures de supervision humaine mises en place conformément à l'Art. 14."@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

# --- Point 7 : Accuracy, robustness, cybersecurity (Art. 15) ---

ao:annexIV_accuracyMetrics a owl:DatatypeProperty ;
    rdfs:label "métriques de précision (Annexe IV, pt. 7)"@fr ;
    rdfs:comment "Métriques de précision utilisées et résultats des tests."@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:string .

ao:annexIV_robustnessTests a owl:DatatypeProperty ;
    rdfs:label "tests de robustesse (Annexe IV, pt. 7)"@fr ;
    rdfs:comment "Tests de robustesse effectués et résultats (adversarial, distribution shift)."@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:string .

ao:annexIV_cybersecurityMeasures a owl:DatatypeProperty ;
    rdfs:label "mesures de cybersécurité (Annexe IV, pt. 7)"@fr ;
    rdfs:comment "Mesures de cybersécurité prises pour protéger le système."@fr ;
    rdfs:domain ao:AISystem ;
    rdfs:range xsd:string .

# --- Point 8 : Substantial modifications ---

ao:annexIV_changeLog a owl:DatatypeProperty ;
    rdfs:label "journal des modifications (Annexe IV, pt. 8)"@fr ;
    rdfs:comment "Description des modifications substantielles apportées au système."@fr ;
    rdfs:domain ao:ModelVersion ;
    rdfs:range xsd:string .

# --- Point 9 : Harmonised standards ---

ao:annexIV_appliedStandards a owl:DatatypeProperty ;
    rdfs:label "normes appliquées (Annexe IV, pt. 9)"@fr ;
    rdfs:comment "Liste des normes harmonisées ou spécifications communes appliquées."@fr ;
    rdfs:domain ao:ConformityAssessment ;
    rdfs:range xsd:string .

# =============================================================================
# OWL 2 RESTRICTIONS (DL-safe)
# =============================================================================

# Every FileVersion MUST have exactly one HashDigest
ao:FileVersion rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:hasHash ;
    owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onClass ao:HashDigest
] .

# Every AuditEvent MUST have exactly one timestamp
ao:AuditEvent rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:timestamp ;
    owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onDataRange xsd:dateTime
] .

# Every AuditEvent MUST have exactly one EventType
ao:AuditEvent rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:hasEventType ;
    owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onClass ao:EventType
] .

# Every AuditEvent MUST concern at least one File
ao:AuditEvent rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:concernsFile ;
    owl:minQualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onClass ao:File
] .

# Every HashDigest MUST have exactly one hashValue
ao:HashDigest rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:hashValue ;
    owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onDataRange xsd:hexBinary
] .

# Every HashDigest MUST have exactly one hashAlgorithm
ao:HashDigest rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:hashAlgorithm ;
    owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onDataRange xsd:string
] .

# --- EU AI Act restrictions ---

# Every AISystem MUST have exactly one RiskLevel
ao:AISystem rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:hasRiskLevel ;
    owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onClass ao:RiskLevel
] .

# Every AISystem MUST have exactly one ComplianceStatus
ao:AISystem rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:hasComplianceStatus ;
    owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onClass ao:ComplianceStatus
] .

# Every Incident MUST involve exactly one AISystem
ao:Incident rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:involvesSystem ;
    owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onClass ao:AISystem
] .

# Every Incident MUST have exactly one IncidentSeverity
ao:Incident rdfs:subClassOf [
    a owl:Restriction ;
    owl:onProperty ao:hasIncidentSeverity ;
    owl:qualifiedCardinality "1"^^xsd:nonNegativeInteger ;
    owl:onClass ao:IncidentSeverity
] .
