Provenance — détail : audit trail FHIR
Ressource d'audit trail métadonnée qui trace : qui a créé/modifié quoi, quand, avec quel agent (humain + device), sous quelle autorité légale. Compatible W3C PROV-DM, indispensable pour RGPD article 30 (registre des activités) et HIPAA audit logs.
Lien W3C PROV-DM
FHIR Provenance est aligné sur le W3C Provenance Data Model (PROV-DM) :
target= PROV Entity (la ressource impactée).agent= PROV Agent (qui a fait).activity= PROV Activity (l'action : CREATE, UPDATE, DELETE).entity= liens avec d'autres entités (version précédente, ressource dérivée).
Permet l'export vers des graphes PROV-O (RDF) pour analyses de provenance avancées.
Champs clés
| Champ | Cardinalité | Rôle |
|---|---|---|
target | 1..* | Ressource(s) impactée(s) par l'action. |
occurred[x] | 0..1 | Quand l'action est arrivée (Period ou dateTime). |
recorded | 1..1 | Quand le Provenance lui-même est enregistré. |
policy | 0..* | URI vers la politique applicable (procédure, règle métier). |
location | 0..1 | Lieu de l'action. |
authorization | 0..* | Justification légale/médicale (TREAT, EMERG, REQUEST...). |
activity | 0..1 | CREATE / UPDATE / DELETE / READ / EXECUTE (v3-DataOperation). |
agent | 1..* | Acteurs (auteur, device, organisation, witness). |
entity | 0..* | Autres entités liées (revision, derivation, source). |
signature | 0..* | Signature électronique JWS/XAdES. |
Provenance vs AuditEvent
Choix critique :
- Provenance — métadonnée business. Attaché aux ressources métier (qui a écrit cette prescription, qui a modifié cet examen). Léger, indexé avec les ressources.
- AuditEvent — log technique. Trace des accès, lectures, exports, exceptions. Volume élevé, stockage séparé.
En pratique : Provenance pour le "what" et le "who" de chaque changement. AuditEvent pour les accès lecture + erreurs.
Exemple : modification ordonnance par médecin
{
"resourceType": "Provenance",
"id": "prov-rx-887-update",
"target": [{ "reference": "MedicationRequest/rx-doliprane-2026-887" }],
"occurredDateTime": "2026-05-19T15:30:00+02:00",
"recorded": "2026-05-19T15:30:05+02:00",
"policy": [
"https://www.hl7.fr/policies/PrescriptionElectronique-v3.html"
],
"location": { "reference": "Location/cabinet-bernard-paris13" },
"authorization": [{
"concept": {
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
"code": "TREAT",
"display": "Treatment"
}]
}
}],
"activity": {
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/v3-DataOperation",
"code": "UPDATE"
}]
},
"agent": [{
"type": {
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type",
"code": "author"
}]
},
"role": [{
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType",
"code": "AUT"
}]
}],
"who": {
"reference": "Practitioner/dr-bernard-claude",
"display": "Dr Claude BERNARD - RPPS 10003040506"
}
}, {
"type": {
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type",
"code": "device"
}]
},
"who": {
"reference": "Device/maincare-prescription-module-v8.2"
}
}],
"entity": [{
"role": "revision",
"what": {
"reference": "MedicationRequest/rx-doliprane-2026-887/_history/2",
"display": "Previous version : 1 cp x 4 par jour"
}
}],
"signature": [{
"type": [{
"system": "urn:iso-astm:E1762-95:2013",
"code": "1.2.840.10065.1.12.1.1",
"display": "Author's Signature"
}],
"when": "2026-05-19T15:30:05+02:00",
"who": { "reference": "Practitioner/dr-bernard-claude" },
"sigFormat": "application/jose",
"data": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkRSX0JFUk5BUkRfQ0xBVURFXzIwMjYifQ..."
}]
} Pièges courants
- Pas de signature — pour la France, une prescription électronique doit être signée (CPS card + JWS). Provenance sans signature = invalide médico-légalement.
- agent absent ou anonyme — le "who" doit être identifié (RPPS, NPI, identifiant unique). Sinon impossible de tracer l'imputabilité.
- occurred = recorded — confondre les deux. occurred = quand l'acte clinique, recorded = quand le système l'a enregistré (peut différer en cas de saisie différée).
- entity[].role manquant — sans role, on ne sait pas si l'entité référencée est une version antérieure, une source, un derivative.