AttestScopeEN

Spécification · version 0.1.1

Le format AttestScope

Texte normatif pour les outils qui écrivent des fichiers de trace, pour les émetteurs et pour les vérificateurs de ces fichiers. Les mots clés DOIT, NE DOIT PAS, DEVRAIT et PEUT rendent MUST, MUST NOT, SHOULD et MAY, et s’emploient au sens de la RFC 2119 (Request for Comments 2119, publiée par l’Internet Engineering Task Force).

Responsabilité humaine auditable pour le raisonnement assisté par l’IA. AttestScope est un human accountability record : accountability au sens de la responsabilité humaine, qui répond de quoi, et non au sens juridique d’un texte.

Version 0.1.1, publiée le 26 octobre 2026 (version 0.1 : 27 septembre 2026). Le format évolue : chaque nouvelle version est publiée ici, avec la liste de ses changements.

Traduction. La version anglaise fait foi.

Implémentation de référence Riftveil · Éditeur Riftveil

Lecture guidée · non normative

Anatomie d’une trace : ce que contient le fichier

Le fichier de trace d’Elena tel qu’il a été scellé la première fois, partie par partie : six couches, deux empreintes, deux sceaux, deux signatures. Pour chaque champ, ce qui entre dans une empreinte, ce que couvrent chaque sceau et chaque signature, et ce qui reste en dehors.

Aller au texte de la spécification

Émetteur · riftveil.ai Personne qui signe

Vue éclatée · Six couches

champentre dans l’empreinte champhors empreinte

  1. 1

    Identité de la trace

    formatversionrecord_id → idissueroriginissued_at

    L’identifiant entre dans l’empreinte sous le nom id. origin est couverte par le sceau à travers son libellé (riftveil-seal-v1 pour « généré »). issued_at reprend l’heure de l’identifiant.

  2. 2

    Évaluation

    protocolmodelassistantlanguage

    language est informatif. Pour un rapport fait ailleurs et enregistré, c’est assistant qui entre dans l’empreinte (profil riftveil-content-v1).

  3. 3

    Contenu : les textes exacts

    projectcontextreport

    Copiés tels qu’évalués, envoyés et reçus, sans coupe, reformatage ni traduction. Ils restent chez la personne qui détient le fichier ; l’émetteur ne garde rien.

  4. 4

    Preuve du rapport

    posée par riftveil.ai en fin d’évaluation

    empreintesha-256 · riftveil-report-v1 · 44ad2fc8676594a6…f84689d9
    sceauS1-REQ8-RW0G-J013-M23D-C969-73JZ-MF93-1W6J
    signatureed25519-1 · RLk8n-uArHiModfT…
    vérificationhttps://riftveil.ai/api/verify

    Sceau HMAC-SHA256 (clé 1) sur "riftveil-seal-v1|" + id + "|" + empreinte ; signature Ed25519 (clé ed25519-1) sur le même message

  5. 5

    Suivi : ce que la personne en a fait

    facultatif

    profileverified_bycheckedquestions[ n · question · suggested_owner · assigned_to ]decisionconditionsplacesignaturefinal_documentpreviousdecided_at

    Rempli par la personne qui décide, jamais par un modèle, après le rapport. Son empreinte reprend aussi l’identifiant et l’empreinte du rapport. Il peut désigner le document final, par son empreinte calculée sur l’appareil, et compléter un suivi précédent, gardé tel quel avec sa preuve. Un suivi peut rester non scellé : il est alors montré « présent, non scellé ».

  6. 6

    Preuve du suivi

    scellée à 16:05:12 UTC

    empreintesha-256 · riftveil-decision-v2 · 2fd3a2ae0b46…180115c2
    sceauS1-SP2R-M6Z9-3Y27-M5MB-YB16-57G7-MX47-8GFY
    signatureed25519-1 · H0tFeR7Q-VELQlHZ…
    vérificationhttps://riftveil.ai/api/verify
    sealed_at2026-10-26T16:05:12Z

    Sceau HMAC (clé 1) sur "riftveil-decision-v1|" + id + "|" + empreinte + "|" + sealed_at ; signature Ed25519 (clé ed25519-1) sur le même message

Empreinte du rapport

Profil riftveil-report-v1 :
v: 1
id
protocol
model
project
context
report

JSON.stringify de ces sept champs, dans cet ordre, puis SHA-256.

Sceau du rapport

Couvre l’identifiant, l’empreinte et l’origine, par son libellé. La signature Ed25519 porte sur le même message : chacun la contrôle avec la clé publique.

Empreinte du suivi

v: 2
id
report_fingerprint
verified_by
checked
questions
decision
conditions
place
signature
final_document
previous

Sceau du suivi

Couvre l’identifiant, l’empreinte du suivi et l’heure du sceau. Il exige un sceau du rapport valide. La signature Ed25519 porte sur le même message.

Le fichier · Riftveil XT-261026-143205-7K3M-Q9XD-2B8F.json

JSON, UTF-8

{
  "format": "attestscope",
  "version": "0.1.1",
  "record_id": "XT-261026-143205-7K3M-Q9XD-2B8F",
  "issuer": "XT",
  "origin": "generated",
  "issued_at": "2026-10-26T14:32:05Z",
  "assessment": {
    "protocol": "…",
    "model": "…",
    "assistant": "riftveil.ai",
    "language": "fr"
  },
  "content": {
    "project": "Nous recommandons de regrouper nos trois fournisseurs cloud dans un contrat…",
    "context": "Décision du conseil d’administration le mois prochain.",
    "report": "Registre · Triage : CRITIQUE · … · Aucun verdict. La décision vous appartient."
  },
  "proof": {
    "fingerprint": {
      "alg": "sha-256",
      "profile": "riftveil-report-v1",
      "value": "44ad2fc8676594a6…f84689d9"
    },
    "seal": {
      "value": "S1-REQ8-RW0G-J013-M23D-C969-73JZ-MF93-1W6J",
      "verify": "https://riftveil.ai/api/verify"
    },
    "signature": {
      "alg": "ed25519",
      "key": "ed25519-1",
      "value": "RLk8n-uArHiModfT…",
      "keys": "https://attestscope.ai/test-keys.json"
    }
  },
  "follow_up": {
    "profile": "riftveil-decision-v2",
    "verified_by": { "last_name": "Lambert", "first_name": "Elena", "role": "Directrice financière" },
    "checked": "Les prix des années 2 à 5 des trois offres, avec les achats.",
    "questions": [
      {
        "n": 1,
        "question": "Que coûte la sortie du contrat si le prix augmente après la première année ?",
        "suggested_owner": "Achats",
        "assigned_to": "Daniel Murphy, responsable des achats"
      }
    ],
    "decision": "conditions",
    "conditions": "Signature du contrat seulement après l’analyse du coût de sortie, présentée au conseil.",
    "place": "",
    "signature": { "method": "drawn", "image": "data:image/png;base64,…" },
    "decided_at": "2026-10-26T16:05:12Z",
  "proof": {
      "fingerprint": {
        "alg": "sha-256",
        "profile": "riftveil-decision-v2",
        "value": "2fd3a2ae0b46…180115c2"
      },
      "seal": {
        "value": "S1-SP2R-M6Z9-3Y27-M5MB-YB16-57G7-MX47-8GFY",
        "sealed_at": "2026-10-26T16:05:12Z",
        "verify": "https://riftveil.ai/api/verify"
      },
      "signature": {
        "alg": "ed25519",
        "key": "ed25519-1",
        "value": "H0tFeR7Q-VELQlHZ…",
        "keys": "https://attestscope.ai/test-keys.json"
      }
    }
  },
  "notice": "…"
}

"format"Nom du format depuis la version 0.1.1 ; les traces de la version 0.1 portent « assay-record » et restent lisibles. La notice en langue du rapport n’est couverte ni par le sceau ni par la signature. Textes longs abrégés ici par « … ».

S1S1

Pourquoi deux sceaux et deux signatures

Le suivi s’ajoute après le rapport, sans toucher au sceau de l’évaluation.

Il n’appartient qu’à un rapport : son empreinte inclut celle du rapport. Déplacé vers un autre rapport, il ne se vérifie plus.

Le sceau du suivi n’est posé que si le sceau du rapport est valide. Chaque sceau a sa signature, sur le même message.

Ce que contient le rapport

Registre

Triage : CRITIQUE · examen : question, réponse, raisonnement, perspective, mise en pratique

Constats : 3, dont impact CRITIQUE : 1 · ÉLEVÉ : 2 · MODÉRÉ : 0 · FAIBLE : 0

Hypothèses : 4 avec un vérificateur nommé · 0 sans

Questions : 5 avec un responsable · 1 sans

Question la plus utile : Que coûte la sortie du contrat si le prix augmente après la première année ?

Indépendance : non précisée par l’utilisateur, à confirmer par le signataire

  • 1. Contexte et triage
  • 2. Ce qui tient
  • 3. Ce qui mérite un examen · dont « Pré-mortem » au niveau CRITIQUE
  • 4. Hypothèses sur lesquelles repose le projet
  • 5. Questions avant de décider

« Aucun verdict. La décision vous appartient. »

Ce qui ne quitte jamais l’appareil

  • Les noms et la fonction
  • La décision et ses conditions
  • La signature
  • Le fichier de trace lui-même

Pour sceller le suivi, seule son empreinte part. Le projet et le contexte, eux, passent par riftveil.ai pour l’évaluation, sans y être conservés.

Une empreinte

SHA-256 : 64 caractères hexadécimaux. Un mot changé, et l’empreinte change entièrement. On ne peut pas retrouver le texte à partir d’elle.

« … un contrat unique de cinq ans. »5b15598e cb55f7af 126a44e8 7f7f96fe aed2bcfe 1c6df1eb 906f7785 c02af590

« … un contrat unique de six ans. »14fb2c1f ca5c3b41 49018200 b0f2c2e3 deb088e8 e7d9b35d 8819b547 25e8d136

Calcul réel sur la seule phrase du projet, en UTF-8. L’empreinte d’une trace porte, elle, sur tous les champs de son profil.

Exemple illustratif : personnes, organisations et montants sont fictifs. Le préfixe XT est réservé aux essais : les sceaux et les signatures de l’exemple sont faits avec les clés de test publiques et ne valent jamais pour une décision. Exemple dans l’état en service (spécification 0.1.1) : le rapport et le suivi portent chacun un sceau et une signature de riftveil.ai ; la signature se contrôle avec la clé publique de riftveil.ai, sans passer par riftveil.ai.

01Fichier de trace

AttestScope Protocol · version 0.1.1. Un fichier JSON (JavaScript Object Notation) par trace, encodé en UTF-8 (Unicode Transformation Format, 8 bits), nommé <Issuer name> <record_id>.json (chez Riftveil : Riftveil RV-261026-143205-7K3M-Q9XD-2B8F.json).

{
  "format": "attestscope",
  "version": "0.1.1",
  "record_id": "RV-261026-143205-7K3M-Q9XD-2B8F",
  "issuer": "RV",
  "origin": "generated",
  "issued_at": "2026-10-26T14:32:05Z",
  "assessment": { "protocol": "1.0.0", "model": "claude-sonnet-5", "assistant": "riftveil.ai", "language": "en" },
  "content": { "project": "…", "context": "…", "report": "…" },
  "proof": {
    "fingerprint": { "alg": "sha-256", "profile": "riftveil-report-v1", "value": "…64 hex…" },
    "seal": { "value": "S1-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX", "verify": "https://riftveil.ai/api/verify" },
    "signature": { "alg": "ed25519", "key": "ed25519-1", "value": "…86 base64url characters…", "keys": "https://riftveil.ai/keys.json" }
  },
  "notice": "…"
}
Champ Règle
format, version "attestscope" et "0.1.1". Les fichiers de la version 0.1 portent "assay-record" et "0.1-draft" ; ils restent valides et chaque vérificateur DOIT encore les lire.
issued_at DOIT reprendre la date et l’heure du record_id. Un vérificateur DOIT rejeter un fichier où elles diffèrent, ainsi qu’une trace dont l’identifiant est daté dans le futur.
origin generated (l’émetteur a produit le rapport) ou registered (rapport produit ailleurs, dont seule l’empreinte a été envoyée). Le sceau et la signature couvrent l’origine par son libellé.
assessment Avec riftveil-report-v1, protocol et model entrent dans l’empreinte. Avec riftveil-content-v1, c’est assistant qui y entre. language est donné à titre d’information.
content Les textes exacts. Ils restent chez la personne qui détient le fichier ; l’émetteur ne garde rien.
proof.fingerprint Recalculée par chaque vérificateur à partir de content (et des champs ci-dessus). On ne se fie jamais à la valeur écrite.
proof.seal Contrôlé par le point d’accès de l’émetteur, au regard de l’empreinte recalculée.
proof.signature OBLIGATOIRE dans la version 0.1.1. Signature Ed25519 de l’émetteur, calculée sur le même message que le sceau. Chacun peut la contrôler avec la clé publique publiée de l’émetteur, sans rien lui demander. Voir Identifiant de trace, sceau et signature.
proof.timestamps FACULTATIF. Une liste d’horodatages portant sur le même message, délivrés par des autorités d’horodatage (RFC 3161). Voir Identifiant de trace, sceau et signature.
notice Informatif. Aucune empreinte ne le couvre.

Deux formes d’une même trace

Forme Contient Gardée par Sert à
Fichier de trace Tout ce qui précède, content compris La personne qui signe, avec le PDF (Portable Document Format), dans le dossier de décision Vérifier qu’un texte est intact
Entrée de registre (prévue, version 0.2) Tout, sauf content Un registre : Microsoft 365, les serveurs du client ou un hébergement (prévu) Compter, suivre, auditer la structure

La version 0.1.1 définit le fichier de trace ; l’entrée de registre est prévue pour la version 0.2.

Un registre fonctionne sans le projet : l’empreinte lui permet de prouver à quel contenu une trace se rapporte, sans détenir ce contenu. Qui détient le fichier de trace détient le contenu : partagez-le comme vous partageriez le rapport.

Suivi et décision (follow_up, facultatif)

Rempli après le rapport par la personne qui décide, jamais par un modèle. Il a sa propre empreinte, son propre sceau et sa propre signature : on peut donc l’ajouter sans toucher à la preuve de l’évaluation.

"follow_up": {
  "profile": "riftveil-decision-v2",
  "verified_by": { "last_name": "…", "first_name": "…", "role": "…" },
  "checked": "What the person checked themselves",
  "questions": [ { "n": 1, "question": "…", "suggested_owner": "CFO", "assigned_to": "…" } ],
  "decision": "proceed | conditions | stop",
  "conditions": "…",
  "place": "…",
  "signature": { "method": "drawn | typed", "typed": "…", "image": "data:image/png;base64,…" },
  "final_document": { "name": "Board memo.pdf", "size": 284113, "sha256": "…64 hex…" },
  "previous": { "profile": "riftveil-decision-v2", "…": "the follow-up this one completes, with its proof" },
  "decided_at": "2026-10-26T16:05:12Z",
  "proof": {
    "fingerprint": { "alg": "sha-256", "profile": "riftveil-decision-v2", "value": "…64 hex…" },
    "seal": { "value": "S1-…", "sealed_at": "2026-10-26T16:05:12Z", "verify": "https://riftveil.ai/api/verify" },
    "signature": { "alg": "ed25519", "key": "ed25519-1", "value": "…", "keys": "https://riftveil.ai/keys.json" }
  }
}
Champ Règle
profile riftveil-decision-v2 dans un fichier 0.1.1. riftveil-decision-v1 (version 0.1) n’apparaît dans un fichier 0.1.1 que sous previous, lorsqu’un fichier 0.1 a été complété.
Entrée de l’empreinte riftveil-decision-v2 : JSON.stringify({ v: 2, id, report_fingerprint, verified_by, checked, questions, decision, conditions, place, signature, final_document, previous }), avec tous les champs présents : chaîne vide pour un champ non rempli, final_document sous la forme { name: "", size: 0, sha256: "" } quand il est absent, previous sous la forme { fingerprint, seal, sealed_at } du suivi qu’il complète, ou trois chaînes vides. report_fingerprint est l’empreinte recalculée de l’évaluation : un suivi appartient à un seul rapport. riftveil-decision-v1 : le même objet sans final_document ni previous, avec v: 1.
signature Signature électronique simple, apposée à l’écran par la personne qui décide. À ne pas confondre avec proof.signature, la signature de l’émetteur. Le sceau et la signature de l’émetteur prouvent à quel moment le suivi existait et qu’il n’a pas changé depuis, jamais qui l’a écrit.
final_document FACULTATIF. Le document qui sort réellement après la décision (une note, un contrat, une présentation) : son nom de fichier, sa taille en octets et le SHA-256 (Secure Hash Algorithm, 256 bits) de ses octets, calculé sur l’appareil de la personne qui signe. Le document lui-même n’est jamais envoyé. Un vérificateur peut alors dire si un document donné est bien celui sur lequel porte la décision.
previous FACULTATIF. Quand une personne complète plus tard un suivi scellé (réponses aux questions, conditions remplies), le nouveau suivi contient l’ancien en entier, avec sa preuve, et son empreinte couvre l’empreinte, le sceau et l’heure du sceau de l’ancien. Chaque suivi antérieur garde sa propre preuve. Le suivi antérieur DOIT être scellé, et scellé strictement avant celui qui le complète. Un fichier NE DEVRAIT PAS contenir plus de 20 suivis antérieurs.
decided_at Informatif, fixé par l’appareil de la personne qui signe. Non couvert par l’empreinte ni par le sceau : l’heure prouvée est proof.seal.sealed_at.
proof.seal Émis par l’émetteur sur l’empreinte du suivi et l’heure de son horloge (sealed_at) ; il exige un sceau valide de l’évaluation. Seules des empreintes sont envoyées : les noms, la décision, la signature et les documents restent sur l’appareil de la personne qui signe.
proof.signature OBLIGATOIRE quand le suivi d’un fichier 0.1.1 est scellé. Signature Ed25519 de l’émetteur, calculée sur le même message que le sceau du suivi.
Suivi non scellé Permis. Un vérificateur l’affiche comme présent mais non scellé : rien ne prouve alors quand il a été écrit, ni qu’il est intact.
Qui l’a écrit Non prouvé. Toute personne qui détient le fichier de trace peut sceller un suivi pour cette trace, sous n’importe quel nom, et un même rapport peut avoir plusieurs suivis. Le sceau et la signature de l’émetteur prouvent à quel moment un suivi existait et qu’il n’a pas changé depuis ; l’identité exige le compte de l’organisation ou une signature qualifiée (prévus). Un vérificateur NE DOIT PAS présenter comme vérifié le nom inscrit dans un suivi.

Les versions suivantes ajouteront outcome (ce qu’est devenue la décision) et readers[] (la chaîne des seconds lecteurs), chacun avec sa propre empreinte.

02Identifiant de trace, sceau et signature

AttestScope Protocol · version 0.1.1 · normatif pour toute implémentation, Riftveil comprise.

Les mots clés DOIT, NE DOIT PAS, DEVRAIT et PEUT s’emploient au sens de la RFC 2119.

1. Format

<ISSUER>-<YYMMDD>-<HHMMSS>-<RRRR>-<RRRR>-<RRRR>
RV-261026-143205-7K3M-Q9XD-2B8F
Partie Règle
ISSUER 2 à 6 lettres de A à Z ; le préfixe est enregistré dans ISSUERS.md. RV désigne Riftveil. Une implémentation NE DOIT PAS utiliser un préfixe qu’elle n’a pas enregistré. XT est réservé aux tests et NE DOIT PAS figurer dans une trace utilisée pour une décision.
YYMMDD Date UTC (temps universel coordonné) à laquelle l’identifiant est attribué (années 2000 à 2099).
HHMMSS Heure UTC à laquelle l’identifiant est attribué, à la seconde près, prise sur une horloge synchronisée avec une source d’heure publique.
RRRR-RRRR-RRRR 60 bits tirés d’un générateur aléatoire cryptographiquement sûr, écrits en base32 de Crockford (0-9 A-Z sans I L O U) : 12 caractères en 3 groupes de 4.

Motif : ^[A-Z]{2,6}-\d{6}-\d{6}-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}-[0-9A-HJKMNP-TV-Z]{4}$

2. Attribution

  1. L’identifiant DOIT être attribué par le code, au moment où la trace est créée.
  2. L’identifiant NE DOIT PAS être produit, suggéré ou complété par un modèle de langage. Les modèles répètent des valeurs « aléatoires » : un identifiant écrit par un modèle n’est pas unique.
  3. L’identifiant NE DOIT PAS être dérivé du contenu (un hachage du projet ou du rapport) : deux projets identiques, évalués deux fois, donnent deux traces.
  4. Un identifiant NE DOIT PAS être réutilisé, même pour une nouvelle version de la même trace. Une nouvelle version reçoit un nouvel identifiant et renvoie à la précédente.
  5. Les outils qui lisent un identifiant DOIVENT accepter les minuscules et les espaces ; la forme canonique est en majuscules, avec des traits d’union.

3. Pourquoi les doublons sont exclus en pratique

  • Deux émetteurs produisent toujours des identifiants distincts : leurs préfixes diffèrent.
  • Chez un même émetteur, deux identifiants ne peuvent coïncider que s’ils sont attribués dans la même seconde et tirent les mêmes 60 bits aléatoires (1 chance sur 1,15 × 10¹⁸ pour chaque paire).
  • À 1 million de traces par jour pour un émetteur, la probabilité d’un seul doublon est d’environ 1 sur 500 millions par an. À 1 000 traces par seconde, elle est d’environ 1 sur 70 000 par an.
  • C’est une probabilité, pas une impossibilité mathématique. Un émetteur qui a besoin d’une unicité absolue PEUT en outre comparer chaque nouvel identifiant à son propre registre et refaire un tirage s’il l’y trouve ; il NE DOIT PAS raccourcir la partie aléatoire pour le faire.

4. Sceau

Un émetteur DOIT sceller chaque trace de version 0.1.1, afin de pouvoir confirmer, sans rien conserver, qu’il a émis cet identifiant pour ce contenu. (En version 0.1, le sceau était recommandé.)

  • Empreinte. SHA-256, en hexadécimal, du contenu que l’émetteur définit comme contenu de la trace. Cette définition (le profil) DOIT être publiée et DOIT inclure l’identifiant chaque fois que l’émetteur a produit lui-même le contenu.
  • Message. "<label>|" + id + "|" + fingerprint, en UTF-8. Pour un suivi : "<label>|" + id + "|" + fingerprint + "|" + sealed_at.
  • Sceau. S<k>- suivi des 160 premiers bits de HMAC-SHA256(key_k, message) (HMAC : Hash-based Message Authentication Code, code d’authentification de message à clé secrète), en base32 de Crockford, 8 groupes de 4. k est le numéro de la clé ; une nouvelle clé reçoit un nouveau numéro, et les anciennes clés restent disponibles pour la vérification.
  • Un libellé par origine. Un émetteur qui produit des rapports et enregistre aussi des rapports produits ailleurs DOIT utiliser un libellé différent pour chaque origine, afin qu’un sceau ne puisse jamais être présenté comme relevant de l’autre origine. Le suivi a son propre libellé.
  • Clé. Elle DOIT rester secrète chez l’émetteur, dans un coffre de secrets, jamais dans le code, dans un fichier partagé ou dans une conversation.
  • Point d’accès de vérification. L’émetteur DOIT en publier un qui, pour { id, fingerprint, seal }, répond « valide » ou « non valide » et indique l’origine, et qui ne conserve rien.

Un sceau valide montre que l’émetteur a attribué l’identifiant, à l’heure de son horloge, pour cette empreinte et cette origine. Un sceau porte sur la date et l’intégrité ; le fond relève de la personne qui signe.

Portée juridique. Un sceau défini dans cette section est un code calculé par l’émetteur avec une clé secrète. Il montre que l’émetteur a attribué l’identifiant, à l’heure de son horloge, pour cette empreinte et cette origine.

5. Signature

Depuis la version 0.1.1, l’émetteur signe aussi chaque message qu’il scelle, par une signature à clé publique. Seul l’émetteur peut contrôler un sceau ; chacun peut contrôler une signature, avec la clé publique de l’émetteur, sans rien lui demander.

  • Algorithme. Ed25519 (RFC 8032), pur, sans pré-hachage.
  • Message. Exactement le message du sceau (section 4), octet pour octet, en UTF-8. La signature couvre donc le même identifiant, la même empreinte, la même origine et, pour un suivi, la même heure de sceau.
  • Encodage. La signature de 64 octets en base64url (RFC 4648, section 5), sans remplissage : 86 caractères. Seul l’encodage canonique est valide : un vérificateur DOIT rejeter une valeur dont le dernier caractère porte des bits inutilisés non nuls. Ni la signature ni le sceau ne peuvent servir d’identifiant.
  • Champ. proof.signature dans la trace, follow_up.proof.signature dans le suivi : { "alg": "ed25519", "key": "<key id>", "value": "<base64url>", "keys": "<URL of the key list>" }. keys est donné à titre d’information : n’importe qui peut écrire un fichier, un vérificateur NE DOIT donc pas s’en servir pour choisir la liste des clés (section 6).
  • Obligatoire. Un fichier 0.1.1 DOIT contenir proof.signature, et un suivi scellé d’un fichier 0.1.1 DOIT contenir follow_up.proof.signature. Un émetteur qui n’a pas de clé de signature écrit des fichiers de version 0.1.
  • Clé privée. Elle DOIT être créée et gardée par l’émetteur dans un coffre de secrets, jamais dans le code, dans un fichier partagé ou dans une conversation. Elle NE DOIT PAS être la clé de scellement. Elle DOIT être accessible au seul service de production de l’émetteur, jamais aux déploiements de test ou de prévisualisation accessibles à d’autres ; un émetteur DEVRAIT aussi réserver la signature au nom d’hôte de sa production.
  • Signer plus tard (contresignature). Un émetteur PEUT signer, plus tard, le message d’un rapport dont il vient de contrôler le sceau, seulement quand la trace est datée d’avant le moment où l’émetteur a commencé à signer (valid_from de sa première clé). Cela permet à une trace 0.1 de devenir une trace 0.1.1 lorsqu’un suivi est ajouté. Un vérificateur DOIT afficher une telle signature comme faite après la date de la trace. Un émetteur NE DOIT PAS signer plus tard un rapport daté d’après le moment où il a commencé à signer : une telle trace porte déjà sa signature, si bien qu’une clé de scellement volée ne permet pas d’obtenir pour elle de nouvelles signatures.

Une signature valide montre que le détenteur de la clé privée de l’émetteur a signé ce message. Elle n’en dit ni plus ni moins que le sceau : elle porte sur la date et l’intégrité, jamais sur le fond.

6. Clés publiques

L’émetteur DOIT publier ses clés publiques dans une liste des clés, à une adresse fixe enregistrée avec son préfixe dans ISSUERS.md, et DEVRAIT publier la même liste à au moins deux autres endroits qu’il n’héberge pas sur le même serveur. Un vérificateur DOIT prendre la liste des clés à l’adresse enregistrée pour le préfixe du record_id (ou dans une copie de cette liste à laquelle il se fie déjà), jamais dans le fichier de trace. Riftveil : https://riftveil.ai/keys.json, keys/riftveil.json dans le dépôt GitHub de la spécification AttestScope, et https://attestscope.ai/keys/riftveil.json.

{
  "issuer": "RV",
  "updated": "2026-10-26",
  "rules": "…",
  "keys": [
    {
      "id": "ed25519-1",
      "alg": "ed25519",
      "public_key": "…43 base64url characters…",
      "status": "active",
      "valid_from": "2026-10-26",
      "valid_until": null,
      "compromised_at": null
    }
  ]
}
Champ Règle
id ed25519-<n>, numérotée comme les clés de scellement. Un numéro n’est jamais réutilisé.
public_key La clé publique de 32 octets, en base64url sans remplissage.
status active (signe aujourd’hui), retired (ne signe plus ; ses signatures restent valides) ou compromised.
valid_from, valid_until Dates (UTC) entre lesquelles la clé a signé. valid_until vaut null tant que la clé est active.
compromised_at Pour une clé compromise : la date à partir de laquelle sa partie privée a pu être connue de quelqu’un d’autre.
issuer, updated, rules Le préfixe de l’émetteur, la date de la dernière modification, et les règles de la liste en langage courant. À titre d’information.

Règles de la liste :

  1. Aucune clé n’est jamais retirée de la liste. Une clé retired reste dans la liste, avec ses dates.
  2. Une clé compromise reste dans la liste, marquée compromised et datée. Un vérificateur NE DOIT PAS signaler comme valide, à elle seule, une signature faite avec elle, quelle que soit sa date ; la trace a alors besoin d’autres éléments de preuve (un horodatage, un registre).
  3. Un vérificateur DOIT indiquer quand l’heure d’une trace (l’heure de son identifiant, ou sealed_at pour un suivi) est antérieure au valid_from de la clé qui l’a signée (signature faite plus tard, voir section 5), et NE DOIT PAS signaler comme valide une signature portant sur une trace datée d’après valid_until.
  4. Un vérificateur NE DOIT PAS accepter comme trace valide de cet émetteur un fichier non signé (version 0.1) dont l’identifiant est daté d’après le moment où l’émetteur a commencé à signer : sa signature a été retirée.
  5. Les trois copies publiées DOIVENT être identiques. Un vérificateur qui constate une différence NE DOIT PAS se fier à la liste.
  6. L’émetteur continue de contrôler ses sceaux HMAC avec chaque clé de scellement pendant au moins douze mois après avoir annoncé qu’il cessera de les contrôler.

7. Horodatages

proof.timestamps (et follow_up.proof.timestamps) est une liste FACULTATIVE. Chaque entrée est un horodatage portant sur le SHA-256 du même message que le sceau et la signature :

"timestamps": [
  { "type": "rfc3161", "tsa": "Name of the authority", "imprint": "…64 hex…", "token": "…base64 of the DER TimeStampToken…" }
]
Champ Règle
type rfc3161. D’autres types PEUVENT être définis plus tard.
tsa Nom de l’autorité d’horodatage, à titre d’information.
imprint SHA-256, en hexadécimal, du message (section 4). Il DOIT être égal à l’empreinte de message figurant dans le jeton.
token Le TimeStampToken de la RFC 3161, au format DER (Distinguished Encoding Rules), en base64.

Un horodatage prouve la date indépendamment de l’émetteur. Un horodatage délivré par un prestataire de services de confiance qualifié, dans le cadre d’un service d’horodatage qualifié, est un horodatage électronique qualifié au sens du règlement (UE) n° 910/2014 (règlement eIDAS, sur l’identification électronique et les services de confiance). Une organisation PEUT utiliser sa propre autorité d’horodatage. Plusieurs horodatages PEUVENT être ajoutés à la même trace. Chez Riftveil, les horodatages par une autorité tierce sont prévus en option avec la traçabilité AttestScope ; Riftveil n’en ajoute aucun aujourd’hui. La date et l’heure de l’horloge de l’émetteur, scellées et signées (issued_at par l’identifiant, sealed_at), constituent l’horodatage de l’émetteur (chez Riftveil : l’horodatage Riftveil).

8. Profils Riftveil

Origine Libellé Profil Entrée de l’empreinte
généré sur riftveil.ai riftveil-seal-v1 riftveil-report-v1 JSON.stringify({ v: 1, id, protocol, model, project, context, report })
produit ailleurs, enregistré riftveil-register-v1 riftveil-content-v1 JSON.stringify({ v: 1, assistant, project, context, report })
suivi et décision (0.1.1) riftveil-decision-v1 riftveil-decision-v2 voir record-file.md
suivi et décision (0.1) riftveil-decision-v1 riftveil-decision-v1 voir record-file.md

Le libellé du suivi reste riftveil-decision-v1 pour les deux profils : la version du profil figure dans l’entrée de l’empreinte (v). Les chaînes sont reprises exactement telles qu’elles ont été envoyées au modèle et renvoyées par lui (généré), ou telles que la personne qui enregistre les a collées (enregistré). Vérification : POST https://riftveil.ai/api/verify. Clés : https://riftveil.ai/keys.json.

9. Fichier de trace

Le fichier de trace est la trace elle-même, en JSON : voir record-file.md. Une trace se vérifie sur son fichier de trace, jamais sur un imprimé, une capture d’écran ou un PDF seul : l’identifiant, l’empreinte, le sceau et la signature peuvent être recopiés sur un document modifié, alors que toute modification du texte d’un fichier de trace fait échouer le contrôle. Voir verification.md.

03Vérification

La règle

Une trace se vérifie sur son fichier de trace, jamais sur un imprimé, une capture d’écran ou un PDF seul.

  1. Contrôler la forme : issued_at reprend l’heure du record_id, l’identifiant n’est pas daté dans le futur, chaque champ de texte est une chaîne. Sinon : non conforme. Recalculer l’empreinte à partir du contenu du fichier de trace, selon son profil.
  2. Si elle diffère de l’empreinte écrite dans le fichier : contenu modifié. Arrêter.
  3. Signature (version 0.1.1). Prendre la liste des clés de l’émetteur à l’adresse enregistrée pour le préfixe du record_id (ISSUERS.md ; Riftveil : https://riftveil.ai/keys.json), jamais dans proof.signature.keys, qui est écrit dans le fichier. Trouver la clé nommée par proof.signature.key, et contrôler la signature Ed25519 du message du sceau, construit à partir de l’empreinte recalculée et de l’origine qu’annonce le fichier. Signature non valide, absente, ou faite avec une clé absente de la liste : signature non valide. Faite avec une clé marquée compromised : clé compromise, non valide à elle seule. Faite avec une clé dont valid_from est postérieur à la date de la trace : valide, affichée comme signée plus tard (section 5 de Identifiant de trace, sceau et signature). Fichier de version 0.1 (sans signature) dont l’identifiant est daté d’après le moment où l’émetteur a commencé à signer : signature retirée, non valide. Cette étape n’attend la réponse de personne : l’émetteur n’est pas interrogé.
  4. Sceau. Envoyer { id, fingerprint (recomputed), seal } au point d’accès de l’émetteur : fingerprint y est l’empreinte recalculée. Si le sceau n’est pas valide : non émis. S’il est valide pour une autre origine que celle qu’annonce le fichier : origine falsifiée. Arrêter.
  5. Sinon : valide. Afficher le contenu du fichier et demander à la personne de le comparer avec le document qu’on lui a remis. S’ils diffèrent, le document a été modifié, quoi qu’il affirme.
  6. Si le fichier contient un follow_up : recalculer son empreinte (elle inclut l’empreinte du rapport recalculée à l’étape 1). Différente : suivi modifié. Sans sceau : suivi présent, non scellé. Sinon, contrôler sa signature comme à l’étape 3, sur le message du suivi (avec sealed_at), et l’envoyer avec la requête de l’étape 4, sous la forme decision: { fingerprint, seal, sealedAt } ; la réponse ajoute decision: { valid, sealedAt }.
  7. Si le suivi contient previous : vérifier chaque suivi antérieur de la même façon, tout au long de la chaîne, signature comprise quand c’est un suivi 0.1.1. Un suivi antérieur modifié, non valide, mal signé, ou non scellé strictement avant celui qui le complète est signalé comme tel ; le suivi qui le complète reste valide, puisque son empreinte ne couvre que la preuve du suivi antérieur. Un vérificateur PEUT s’arrêter après 20 suivis antérieurs et signaler le fichier comme non conforme.
  8. Si le suivi contient final_document : quand une personne présente un document, calculer le SHA-256 de ses octets sur son appareil et le comparer avec final_document.sha256. Égaux : c’est le document sur lequel porte la décision. Différents : ce n’est pas le document sur lequel porte la décision.

Les étapes 3 et 4 répondent à la même question de deux façons : la signature avec la clé publique, par n’importe qui ; le sceau par l’émetteur. Un vérificateur sans accès réseau à l’émetteur peut tout de même contrôler la signature, avec une copie de la liste des clés.

Contrôler les trois valeurs seules (identifiant, empreinte, sceau) prouve seulement qu’elles vont ensemble, et non qu’un texte donné est la trace.

Points d’accès de Riftveil

Point d’accès Corps de la requête Réponse
POST https://riftveil.ai/api/verify { id, fingerprint, seal, signature?, decision? } { valid: true, id, issuedAt, origin, signature?, decision? } ou { valid: false } ; signature est { valid, key, status?, reason? }, et une clé marquée compromise donne toujours valid: false
POST https://riftveil.ai/api/register { fingerprint, profile: "riftveil-content-v1" } { id, seal, signature, issuedAt, origin: "registered", profile }
POST https://riftveil.ai/api/decide { id, report_fingerprint, report_seal, fingerprint } { seal, sealedAt, origin, signature, report_signature }
GET https://riftveil.ai/keys.json La liste des clés (section 6 de Identifiant de trace, sceau et signature)

/api/verify accepte les requêtes de tout site (CORS : Cross-Origin Resource Sharing, partage de ressources entre origines), ne reçoit que des empreintes et ne conserve rien ; si on lui donne signature: { key, value } (et decision.signature), il contrôle aussi les signatures avec les clés publiées, par commodité. /api/register et /api/decide s’utilisent depuis les pages de riftveil.ai, derrière un contrôle anti-robots ; eux aussi ne reçoivent que des empreintes, et ne gardent qu’un compteur quotidien par adresse IP (Internet Protocol) hachée. report_signature est la signature du message du sceau du rapport : elle permet de compléter une trace 0.1, ou une trace enregistrée, pour en faire une trace 0.1.1. https://riftveil.ai/issuers.json donne la liste des préfixes enregistrés.

Pages et module de vérification

  • https://riftveil.ai/verify.html (en français : /fr/verify.html) : vérification par le fichier de trace, ou par les trois valeurs, avec un avertissement. La signature est contrôlée dans le navigateur avec la clé publique ; on peut y comparer un document final ; « Compléter le suivi » rouvre la trace pour ajouter un suivi qui complète le précédent.
  • https://riftveil.ai/register.html (en français : /fr/register.html) : enregistrement d’un rapport produit ailleurs ; l’empreinte est calculée dans le navigateur, puis le fichier de trace se télécharge ; le suivi peut ensuite être rempli et scellé, comme pour un rapport généré sur riftveil.ai.
  • Module de vérification pour n’importe quelle page (il vérifie l’évaluation, sa signature, ainsi que le sceau et la signature du suivi ; les suivis antérieurs et le suivi lui-même s’affichent sur riftveil.ai/verify, qui est le vérificateur complet) :
<div data-riftveil-verify data-lang="fr"></div>
<script src="https://riftveil.ai/embed/verify.js" defer></script>

La politique de sécurité du contenu (en-tête Content-Security-Policy) de la page hôte doit autoriser script-src et connect-src https://riftveil.ai.

Ce qui reste possible, et comment y répondre

Risque État
Texte modifié dans un PDF Détecté quand on utilise le fichier de trace ; non détecté sur un PDF seul. Un cachet électronique qualifié sur le PDF est prévu.
Document modifié après la décision Détecté quand le suivi désigne un document final et que ce document est présenté pour comparaison.
Identifiant recopié d’une autre trace Détecté : le fichier de trace montre le texte de l’autre trace.
Rapport enregistré présenté comme généré Détecté : un libellé par origine, dans le sceau et dans la signature.
Projet inventé, évalué pour de vrai Non détectable, et ce n’est pas le but : le sceau prouve la provenance et l’intégrité, jamais la vérité.
Vol de la clé de scellement Clé dans un coffre de secrets ; rotation par numéro de clé, et les sceaux antérieurs restent valides. La clé de signature est une clé distincte.
Vol de la clé de signature Clé dans un coffre de secrets, numérotée ; la clé est marquée compromise et datée dans la liste publiée, et n’en est jamais retirée.
Émetteur indisponible La signature reste vérifiable avec la liste des clés publiée.
Suivi ajouté par une autre personne que celle qui est nommée Non empêché : le sceau prouve quand, pas qui. Le nom est affiché comme déclaré, jamais comme vérifié.
Signature retirée pour passer pour un fichier 0.1 Détecté : un fichier non signé daté d’après le moment où l’émetteur a commencé à signer est rejeté.
Personne ne vérifie Organisationnel : rendre le fichier de trace obligatoire dans le dossier de décision.

04Conformité

AttestScope Protocol · version 0.1.1. Les mots clés DOIT, NE DOIT PAS, DEVRAIT et PEUT s’emploient au sens de la RFC 2119.

Une déclaration de conformité nomme le rôle et la version : « écrit des fichiers de trace AttestScope 0.1.1 », « vérifie des fichiers de trace AttestScope 0.1.1 », « émet des traces AttestScope 0.1.1 sous le préfixe XX ». Une déclaration de conformité à cette spécification ne porte que sur le format. L’attestation que porte un AttestScope Record est celle de la personne qui signe, sur la portée de sa propre revue.

Outil d’écriture

Un outil qui écrit des fichiers de trace :

  1. DOIT produire du JSON en UTF-8, valide selon schema/attestscope-0.1.1.schema.json.
  2. DOIT copier les textes dans content exactement tels qu’ils ont été évalués, envoyés et renvoyés, sans rien en retrancher, sans les remettre en forme et sans les traduire.
  3. DOIT calculer proof.fingerprint.value à partir de ces textes exacts, avec le profil qu’il nomme, et renseigner les champs que ce profil exige : assessment.protocol et assessment.model pour riftveil-report-v1, assessment.assistant pour riftveil-content-v1.
  4. NE DOIT PAS laisser un modèle de langage écrire, suggérer ou compléter le record_id, l’empreinte, le sceau, la signature ni aucun champ de follow_up.
  5. DOIT laisser follow_up absent, ou avec tous ses champs vides, jusqu’à ce qu’une personne le remplisse.
  6. DOIT calculer l’empreinte d’un document final sur l’appareil de la personne qui signe, et NE DOIT PAS envoyer le document.
  7. Quand une personne complète un suivi scellé, DOIT conserver le suivi antérieur en entier sous previous, avec sa preuve, et NE DOIT PAS le modifier.
  8. DEVRAIT nommer le fichier <Issuer name> <record_id>.json.

Émetteur

Un émetteur attribue les identifiants, pose les sceaux et signe :

  1. DOIT utiliser un préfixe enregistré dans ISSUERS, et NE DOIT PAS émettre de traces sous XT pour de vraies décisions.
  2. DOIT attribuer les identifiants par le code, au format défini dans Identifiant de trace, sceau et signature, à partir d’une horloge synchronisée avec une source d’heure publique.
  3. DOIT garder ses clés de scellement et ses clés de signature dans un coffre de secrets, comme des clés distinctes, les numéroter, et garder disponibles pour la vérification les clés de scellement qui ne servent plus.
  4. DOIT utiliser un libellé par origine, et un libellé pour le suivi.
  5. DOIT signer chaque message qu’il scelle dans une trace 0.1.1, avec la clé privée d’une clé active de sa liste publiée.
  6. DOIT publier sa liste des clés à l’adresse indiquée dans ses signatures, la garder identique partout où elle est publiée, ne jamais en retirer de clé, et marquer et dater une clé compromise.
  7. DOIT publier un point d’accès de vérification qui, à partir des seules empreintes, répond « valide » ou « non valide », indique l’origine et, pour un suivi, l’heure du sceau, et qui ne conserve rien.
  8. NE DOIT PAS conserver les textes, une liste d’identifiants ou une liste d’empreintes pour les besoins de la vérification.
  9. DOIT contrôler le sceau du rapport avant de sceller un suivi.
  10. DOIT tenir sa clé de signature à l’écart de tout déploiement de test ou de prévisualisation accessible à d’autres, et NE DOIT PAS signer plus tard un rapport daté d’après le moment où il a commencé à signer.
  11. DEVRAIT limiter la fréquence des scellements, des signatures et des enregistrements, refuser ces opérations quand ses compteurs ne sont pas disponibles, et les protéger contre les abus automatisés.

Vérificateur

Un outil qui vérifie des fichiers de trace :

  1. DOIT recalculer chaque empreinte à partir du fichier, selon son profil, et NE DOIT PAS se fier à une empreinte telle qu’elle est écrite.
  2. DOIT signaler « modifié » quand une empreinte recalculée diffère de celle du fichier, et s’arrêter là pour cette partie.
  3. DOIT contrôler chaque signature d’un fichier 0.1.1 avec la liste des clés publiée de l’émetteur, prise à l’adresse enregistrée pour le préfixe (jamais dans le fichier), DOIT signaler une signature absente comme non valide, et NE DOIT PAS signaler comme valide, à elle seule, une signature faite avec une clé marquée compromise.
  4. DOIT demander au point d’accès de l’émetteur de contrôler chaque sceau, en n’envoyant que l’identifiant, les empreintes, les sceaux et les heures des sceaux, lorsque l’émetteur est joignable.
  5. DOIT indiquer l’origine renvoyée par l’émetteur, et signaler « origine falsifiée » quand elle diffère de celle qu’annonce le fichier.
  6. DOIT vérifier chaque suivi antérieur sous previous et en signaler le résultat séparément.
  7. DOIT afficher les textes scellés, pour qu’une personne puisse les comparer avec le document qu’on lui a remis.
  8. DOIT calculer l’empreinte d’un document final présenté sur l’appareil de la personne, et NE DOIT PAS envoyer le document.
  9. NE DOIT PAS présenter un contrôle de l’identifiant, de l’empreinte et du sceau seuls comme la vérification d’un document.
  10. DOIT continuer à vérifier les fichiers de version 0.1, qui ne portent aucune signature, et DOIT rejeter un tel fichier dont l’identifiant est daté d’après le moment où l’émetteur a commencé à signer.
  11. DOIT rejeter un fichier dont issued_at diffère de l’heure de son record_id, un encodage de signature non canonique, et une trace dont le préfixe est XT quand elle est présentée pour une décision, et DOIT afficher comme telle une signature faite après la date de la trace.
  12. NE DOIT PAS présenter comme vérifié le nom inscrit dans un suivi.
  13. DEVRAIT indiquer dans son résultat qu’une trace valide prouve la provenance et l’intégrité, jamais qu’une décision était la bonne.

05Sécurité et vie privée

AttestScope Protocol · version 0.1.1.

Sécurité et vie privée : ce qui est couvert, et ce qui est prévu

Ce que le format couvre

Risque Parade Risque résiduel
Texte modifié après émission Empreinte recalculée à partir du fichier par chaque vérificateur Aucun sur le fichier de trace ; un PDF montré seul ne prouve rien
Identifiant ou sceau recopié sur un autre document La vérification montre les textes scellés sous cet identifiant Une personne doit comparer les textes avec le document
Rapport enregistré présenté comme généré Un libellé par origine, dans le sceau et dans la signature Aucun
Suivi déplacé vers un autre rapport Son empreinte inclut celle du rapport Aucun
Suivi modifié après scellement Sa propre empreinte, son propre sceau et sa propre signature, avec l’heure de l’émetteur Aucun s’il est scellé ; un suivi non scellé ne prouve rien
Suivi antérieur modifié après avoir été complété Sa preuve reste dans le fichier ; le suivi qui le complète couvre son empreinte, son sceau et l’heure de son sceau Aucun : le suivi antérieur est signalé comme modifié
Document modifié après la décision final_document.sha256, comparé sur l’appareil de la personne qui lit Seulement si le suivi désigne le document et que ce document est présenté
Heure du sceau déplacée L’heure fait partie du message scellé et signé Aucun
Sceau contrefait HMAC-SHA256 tronqué à 160 bits, clé secrète Seul l’émetteur peut contrôler un sceau : la signature porte sur le même message
Signature contrefaite Ed25519, clé privée dans un coffre de secrets ; la liste des clés est prise à l’adresse enregistrée pour l’émetteur, jamais dans le fichier Aucun connu
Émetteur injoignable ou disparu La signature se contrôle avec la liste des clés publiée La liste doit rester publiée ; elle l’est à trois endroits
Clé de scellement volée Coffre de secrets, clés numérotées, rotation ; clé de signature distincte ; aucune signature faite plus tard pour les traces datées d’après le moment où l’émetteur a commencé à signer Les sceaux faits avec une clé volée ne se distinguent pas des autres. Les nouvelles traces exigent toujours la clé de signature. Une trace antidatée d’avant le moment où l’émetteur a commencé à signer pourrait recevoir une signature faite plus tard, que les vérificateurs affichent comme faite après la date de la trace
Clé de signature volée Coffre de secrets, clés numérotées ; la clé est marquée compromise et datée, jamais retirée Les signatures faites avec elle ne prouvent plus rien à elles seules ; il faut alors un horodatage par un tiers, ou un registre
Clé de signature utilisée par un déploiement de test Clé de signature dans l’environnement de production seulement, signature réservée au nom d’hôte de production Aucun si la règle est respectée
Signature retirée (fichier présenté comme 0.1) Un vérificateur rejette un fichier non signé daté d’après le moment où l’émetteur a commencé à signer Aucun
Suivi ajouté par quelqu’un d’autre Non empêché : le suivi prouve quand, pas qui Un vérificateur ne présente jamais le nom comme vérifié ; l’identité exige le compte de l’organisation ou une signature qualifiée (prévus)
Scellement en masse par des robots Contrôle anti-robots, limites quotidiennes par adresse IP et globales, service refusé quand les compteurs ne répondent pas Les compteurs d’un stockage clé-valeur ne sont pas atomiques ; une courte rafale peut dépasser une limite
Prise de contrôle du code ou des comptes de l’émetteur Authentification forte sur les comptes qui publient le code et les listes des clés ; trois copies de la liste Un attaquant qui contrôle toutes les copies peut publier une fausse liste ; voir le journal public prévu (0.2)

Ce qu’il ne couvre pas, par construction

  • La vérité du projet ou la qualité de la revue. Un sceau ou une signature prouvent la provenance et l’intégrité, et rien d’autre.
  • L’identité de la personne qui signe. Une signature apposée à l’écran est une signature électronique simple ; le sceau et la signature de l’émetteur prouvent à quel moment le suivi existait, pas qui l’a écrit.
  • Une date prouvée indépendamment de l’émetteur. L’horloge de l’émetteur est scellée et signée ; un horodatage délivré par une autorité d’horodatage (RFC 3161, proof.timestamps) prouve la date sans s’appuyer sur l’émetteur.

Vie privée

  • Pour la vérification, l’enregistrement et le sceau de décision, l’émetteur ne reçoit que des empreintes, jamais de textes, de noms, de décisions, de signatures ni de documents. Un émetteur qui produit aussi le rapport reçoit les textes pour le rédiger et n’en garde aucun ; le fournisseur du modèle d’IA qu’il emploie peut les garder pour une durée limitée, que la page de confidentialité de l’émetteur indique. Une empreinte SHA-256 ne permet pas de retrouver le texte ; elle permet seulement de confirmer un texte qu’on a déjà, ou qu’on devine.
  • L’empreinte d’un document final est calculée sur l’appareil de la personne qui signe ; le document n’est jamais envoyé.
  • L’émetteur ne conserve aucun texte, ni aucune liste d’identifiants ou d’empreintes. Il ne garde que des compteurs de limitation de courte durée, indexés sur un hachage de l’adresse IP fait avec une clé secrète qui leur est propre.
  • Qui détient un fichier de trace détient les textes, les noms inscrits dans le suivi et le nom du document final. Partagez-le comme vous partageriez le rapport.
  • Une entrée de registre sans les textes est prévue, pour les registres qui ne doivent pas détenir le projet.

06Préfixes d’émetteurs enregistrés

Une implémentation qui écrit des traces AttestScope a besoin de son propre préfixe avant sa première trace utilisée pour une décision. Pour en demander un, écrivez à hello@riftveil.ai, en indiquant le préfixe, le nom, un contact, l’adresse URL (Uniform Resource Locator) du point d’accès de vérification et l’adresse URL de la liste des clés. Chaque demande est examinée, et peut être refusée, par exemple si le préfixe prête à confusion avec celui d’un autre émetteur.

Préfixe Émetteur Vérification Clés Depuis
RV Riftveil (riftveil.ai) POST https://riftveil.ai/api/verify https://riftveil.ai/keys.json 2026-09-27
XT Réservé aux tests, jamais valable pour une décision aucune https://attestscope.ai/test-keys.json (clé de test publique) 2026-09-27

07Versions

Version Date Modifications
0.1.1 2026-10-26 Signature de l’émetteur : Ed25519 sur le même message que chaque sceau, dans proof.signature et follow_up.proof.signature, obligatoire dans les fichiers 0.1.1 ; liste des clés publiques (keys.json) et ses règles ; vérification sans l’émetteur. proof.timestamps facultatif (horodatages RFC 3161, sous forme de liste). Profil de suivi riftveil-decision-v2 : final_document facultatif (empreinte du document sur lequel porte la décision, calculée sur l’appareil de la personne qui signe) et previous (compléter plus tard un suivi scellé, les suivis antérieurs étant conservés avec leur preuve). Suivi d’un rapport enregistré. format devient "attestscope" et version devient "0.1.1" ; schéma attestscope-0.1.1.schema.json, avec une règle conditionnelle sur les champs qu’exige chaque profil d’empreinte. decided_at précisé comme informatif. Un seul exemple d’illustration (Elena Lambert). Règles de sécurité issues d’une revue avant publication : signature faite plus tard (contresignature) réservée aux traces datées d’avant le moment où l’émetteur a commencé à signer, et affichée comme telle ; issued_at égal à l’heure de l’identifiant ; rejet des fichiers non signés datés d’après le moment où l’émetteur a commencé à signer ; encodage canonique de la signature ; clé de signature tenue à l’écart des déploiements de test et de prévisualisation ; le nom inscrit dans un suivi est déclaré, jamais vérifié. Aucun profil existant ne change : les fichiers 0.1 restent valides.
0.1 2026-09-27 Première version publique : fichier de preuve, identifiant de trace, profils riftveil-report-v1, riftveil-content-v1, riftveil-decision-v1, sceaux HMAC, suivi avec décision, règles de vérification, schéma JSON, vecteurs de test. « Fichier de trace » remplace « fichier de preuve » dans le texte ; les noms de champs ne changent pas. Assay Record était le nom de travail de la version de test. Dans les fichiers de trace, le champ format vaut assay-record et le champ version vaut 0.1-draft.

Les rapports émis sur riftveil.ai avant le 24 octobre 2026 portent dans assessment.protocol la numérotation de travail 1.3.x du protocole Riftveil (par exemple 1.3.3) ; leur sceau reste vérifiable.

Prévu pour la version 0.2

  • Le JSON canonique (RFC 8785) comme entrée d’empreinte, à côté des profils actuels.
  • L’entrée de registre : la trace sans content, et un journal public.
  • Le suivi constat par constat, outcome, et readers[], chacun avec sa propre empreinte.
  • L’identité de la personne qui décide : le compte de l’organisation, ou une signature électronique qualifiée du suivi.

Règle de compatibilité

Une nouvelle version garde inchangé le calcul de chaque profil existant. Un vérificateur pour la version 0.1.1 vérifie tout fichier de trace 0.1 ; un vérificateur pour la version 0.2 vérifiera tout fichier de trace 0.1 et 0.1.1.

Gouvernance

Riftveil édite le format et en est l’implémentation de référence. Les commentaires s’adressent à hello@riftveil.ai. Les modifications sont publiées dans ce tableau avant de s’appliquer.

08Exemple

Trace d’illustration : le suivi d’Elena Lambert, complété deux jours plus tard avec le document final. Le préfixe XT est réservé aux essais : ses sceaux et ses signatures sont faits avec les clés de test publiques et ne valent jamais pour une décision. Voir sur GitHub · Schéma JSON sur GitHub · Liste des clés de test

{
  "format": "attestscope",
  "version": "0.1.1",
  "record_id": "XT-261026-143205-7K3M-Q9XD-2B8F",
  "issuer": "XT",
  "origin": "generated",
  "issued_at": "2026-10-26T14:32:05Z",
  "assessment": {
    "protocol": "1.0.0",
    "model": "claude-sonnet-5",
    "assistant": "riftveil.ai",
    "language": "en"
  },
  "content": {
    "project": "We recommend consolidating our three cloud vendors into one five-year contract from Q1 2027. The chosen vendor offers a 22% discount in year one, full migration support and a single point of contact. Savings are estimated at EUR 1.4M over five years.",
    "context": "Chief Financial Officer, board decision next month.",
    "report": "## Record\n- Triage: CRITICAL · examined: question, answer, reasoning, perspective, applicability\n- Findings: 3, by impact CRITICAL: 1 · HIGH: 2 · MODERATE: 0 · LOW: 0\n- Assumptions: 4 with a named verifier · 0 without\n- Questions: 5 with an owner · 1 without\n- Most useful question: \"What does leaving the contract cost if the price rises after the first year?\"\n- Independence: not stated by the user, to be confirmed by the signer\n\n## 1. Context and triage\nThis project is read as a procurement and finance recommendation for a Chief Financial Officer, intended to inform a five-year vendor commitment at board level. Triage: CRITICAL, because a single five-year contract is hard to undo and the financial commitment is high for the organisation. Examined: question, answer, reasoning, perspective, applicability.\nCriteria: reversibility HIGH · impact scope MODERATE · financial commitment HIGH → two criteria at HIGH or above → CRITICAL.\n\nThe five levels of examination: question (what was actually asked) · answer (what the project says) · reasoning (how it gets there) · perspective (what it did not see) · applicability (what it looks like in the real world). Triage: the project's stakes, LOW, MODERATE, HIGH or CRITICAL, judged on reversibility, impact scope and financial commitment; it sets which levels are examined.\n\nIf this framing does not match your situation, say so, and the triage will be redone.\n\n## 2. What holds up\nThe recommendation names one vendor, one start date and one contract length: each can be checked against the offers. A review of what stands, not an endorsement of its content.\n\n## 3. What deserves scrutiny\n\nNote on reasoning: an AI model does not reason in the human sense; the reasoning checks below test logical consistency, not the process that produced the project.\n\n**Pre-mortem: three plausible causes of failure · Impact: CRITICAL**\nObserved: the memo gives no scenario in which the consolidation fails.\nEffect on the decision: three plausible causes are left unexamined: prices rise after year one, a workload cannot move in time, the single vendor's service degrades with no way out.\nTo check: for each cause, what the contract says and who in the organisation would see it coming.\n\n**Exit cost not quantified · Impact: HIGH**\nObserved: the memo proposes a single five-year contract without quantifying what leaving it would cost.\nEffect on the decision: if the price rises after the first year, that cost weighs on the board's decision.\nTo check: ask procurement for the exit cost of each offer, year by year.\n\n**Prices for years 2 to 5 not given · Impact: HIGH**\nObserved: \"a 22% discount in year one\" supports \"savings are estimated at EUR 1.4M over five years\".\nEffect on the decision: a discount limited to year one says nothing about years two to five, where most of the contract value lies.\nTo check: the price schedule for every year of the contract, in the draft contract itself.\n\n## 4. Assumptions the project relies on\n1. Prices after year one stay close to year one. If they rise, the EUR 1.4M saving does not hold. → Who can verify: procurement, with the full price schedule.\n2. All workloads can move before the current contracts end. If not, two vendors are paid at the same time. → Who can verify: the CIO.\n3. The vendor's migration support covers the work the teams would otherwise do. If not, the internal cost is missing from the saving. → Who can verify: the CIO, with the heads of the teams concerned.\n4. One point of contact is enough for three former vendors' services. If not, service levels drop during the first year. → Who can verify: the head of IT operations.\n\n## 5. Questions before you decide\n1. What does leaving the contract cost if the price rises after the first year? Owner: procurement\n2. What are the prices for years 2 to 5 of each offer? Owner: procurement\n3. Which workloads cannot move before the current contracts end? Owner: CIO\n4. What internal effort does the migration need, beyond the vendor's support? Owner: CIO\n5. Which service levels does the contract guarantee, and what happens if they are missed? Owner: head of IT operations\n6. Who will answer to the board if the saving is not there in year three?\n\nNo verdict. The decision is yours."
  },
  "proof": {
    "fingerprint": {
      "alg": "sha-256",
      "profile": "riftveil-report-v1",
      "value": "44ad2fc8676594a6105c621a93dd051de1648c47253351689c8b7f24f84689d9"
    },
    "seal": {
      "value": "S1-REQ8-RW0G-J013-M23D-C969-73JZ-MF93-1W6J",
      "verify": "https://riftveil.ai/api/verify"
    },
    "signature": {
      "alg": "ed25519",
      "key": "ed25519-1",
      "value": "RLk8n-uArHiModfTXjm3Inw8iWm4zVQAMPYczqz-pRtfVx_Z3vbBmV2hQrsdpme4TCZtanhr_mUfWOttBsPsDQ",
      "keys": "https://attestscope.ai/test-keys.json"
    }
  },
  "follow_up": {
    "profile": "riftveil-decision-v2",
    "verified_by": {
      "last_name": "Lambert",
      "first_name": "Elena",
      "role": "Chief Financial Officer"
    },
    "checked": "The prices for years 2 to 5 of the three offers, with procurement. Exit-cost analysis received from Daniel Murphy on 28 October and presented to the board: exit capped at six months of fees.",
    "questions": [
      {
        "n": 1,
        "question": "What does leaving the contract cost if the price rises after the first year?",
        "suggested_owner": "procurement",
        "assigned_to": "Daniel Murphy, Head of Procurement"
      },
      {
        "n": 2,
        "question": "What are the prices for years 2 to 5 of each offer?",
        "suggested_owner": "procurement",
        "assigned_to": ""
      },
      {
        "n": 3,
        "question": "Which workloads cannot move before the current contracts end?",
        "suggested_owner": "CIO",
        "assigned_to": ""
      },
      {
        "n": 4,
        "question": "What internal effort does the migration need, beyond the vendor's support?",
        "suggested_owner": "CIO",
        "assigned_to": ""
      },
      {
        "n": 5,
        "question": "Which service levels does the contract guarantee, and what happens if they are missed?",
        "suggested_owner": "head of IT operations",
        "assigned_to": ""
      },
      {
        "n": 6,
        "question": "Who will answer to the board if the saving is not there in year three?",
        "suggested_owner": "",
        "assigned_to": ""
      }
    ],
    "decision": "conditions",
    "conditions": "Contract signed only after the exit-cost analysis, presented to the board.",
    "place": "",
    "signature": {
      "method": "drawn",
      "typed": "",
      "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAABYCAYAAABPucoWAAAggElEQVR42u2de3RcV3X/v9997ugxI7+tUQKmiW1p5Di0PAyUJCQycULLags/SkQCJcsJFEjXrwRIS+hjlTS/VaCQYv9I6K8taYsDLQSUtvTdEidEThvSggsFamJJsUNt6mjkB4o0I0tzz96/P86VNI4fkW1JVpLzWcsrWpmR5s6953zv3t+zz75AJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUTOBsZT8JzFAV3Z9e01AArA4mmJRCIL7SbEk4tYJBIjrMiCoNsBPR4AWs7ruAKQYvj/Wh59cvHXgZ217JrHSCsSBStyLulKgN60eXn7Kubk4wJ52+QrBgPUHlXyY2Pl3X8DQLIUMRKJgvUcRYAuCT8uNE9oQw7YWSu0dVwHkztIrjLzKcAkk6yUdImZpo2prj58eOCH2bXXBTD+ZNprA4BeHyPAyMmInsaMJlW3A3Yp8IPs39SEWgiCL8ABXyi2Xw3IX4JcCjOAIgb8CLAa6ZphfoJ0uZrYqlrlcA/QLcAuO3fHPBXl2fR5/YFOp7a7YuoaiRHWGUwsBYBFKy/qsERfGiaRlkdb7N8wMDB+btOr4FkViqW3g/J5mNbCVeU+mL3bNSTf0nTCmfKTpLve1HuICExfVyn3b89uWP4c3CQ9ACxf3r54QvhSJNIGD3hqmmvI9T61f9fh+jQ3DsNIFKwZikHz8vZVzsnbjPgwxRVg4aavqn8lCd49eqDv4DkSLQGgy5e3rxpPZC8AgaFGcY3wtY2jBwd669+cb+vYLpBNZvAGe6Ra7rsSuE2B2+fruN1kRLVo5UUdJv5mBa4l2ErKVDCl6g8K5UEH/fXhcv8exEWCyLNAsNzTfA2dZ0EQALqkrbQ6NT5AkdWm3rKJI4ClgCSA9SWw12cTaz5Fi0CXA3otX+z8opDXmOoEXdJomt5TKffdCGxIgJ0psD4H7JoorOh8GxP+uZmaGapkbW2lvHdwngRhKqrKt3ZsIeU9JPNmx50uBUCKo6nuB/CFStl/GHhZOrn6ufDHaj29k/aBPcs0oc5XXFieIhfexT+Zmd3tgJ75MLoF6Gbz8m+fJ4k8THK1qT8KkSaY1gysEFwKaEq6RE37FnH45YODN40Bt8/T4AypUqFY+gDFbTGf1iAuZ/Cfqg72vz8TzzqBhbasKK0zh/8EkJACerxx5OBjfzf3aVd2rG1rX2vmfkvEvdbUK0AhCTV9alLoCSuQSc4sTQEmIglMJ35ptDzwhwssPcxEasaTefL9833jPQOhwkK9MSwowTomOpmqIfLe4JwwlW+PHPx+//wcSpgY+daOPxCX3GQ+HaO4ZjPbC/INDRMT+8Zz7u+FyWWm/ijFNcHSm0bL/X80T5NKAOiiFZ2d6vBtmDqKy6n5L1fL/deeRNgJtDfki/ItgheRhFl6R6U8cOvcHnP42y2t7W+GJPcBgAXzv8FM+2F2F53d68aaUwDQZKIIwRtU8AmYpWFMcMjMvaI6dPEQ0GPneMIfd0OtG6sAXDafvME5sIbvjhxq2ZPVv9XfeLGAhGEyWs/GwIZcy3lPXQIvRTjQT/ivjx0e2L9QUvOFIFiT6YK0tHa+WYH3ULhp6sBImPoKDf8nTZN7jx7Ztb8ufZgLMbBFKzpL6mwnDA0U5sywN6FtGh7s2wsAS4oda1LKV2G2OjuO/ck4rhwe7nsCc14u0O2APZIvjmwX8gozS0EcNE1eVh1qPXjiu3gmwsWOHqG7BjAo9OvVwdxG4GI/N+nWZGTVcR1Mfh+wRTCkEGk26KequeqvY//+sRP9Zr61dD2Fn4Wqp7iGaTE+Z1GWyyarBpFa12WKlwP6RpBdPMk0MtMJg+0RyHeU+B/n5f/V3XgXQEQzXWiMtrZCwZbcBuANIDsJghRozf9C5dDuLyyUCFfO7cd3JQD8krbS6kKx8yETfpnCTTD1ZgozRUgf0AyXfFxytX8G1idzeAEJwLzTPySlAEIUNjgtVl0J0JUMl/v30Pt3kiIwM4q7sNZkN4dB3SVze756fEvryC8K3RWmWiMlgffvqw7tevKZhJzAo2EiGWC8eMWKwcZswHIuxKqltfQawn0RsOUAcnRJM0zvqQ72vT+IVVeC6a1E2QRub6wO9X0eZh+kuAZTPyF0bym0dVwXJky3m+f5wUxUtFDsuCrf1nm/mT1EYgvILpjp1Fh92j8ADYSsA/kWgbxf6b/dUuz8UqHYcVUmgB7TJR7zHagQ6PFoaysUip0fL9iSb1HkgwA7w3fy3kxBQW0hpYRybj+7N21qLb0mBb5AkcuhfizUENEZ8KOsjsiDFPPpuNB1Flb4S8OknO2BG1KpworOjUK30dR7Uhy9vzmI1YZcmDC9KdCVjB4c2KHmH6K4HEwNhpeFCVi0uRtkG3UVVjUr7VYz77NU8EuVg49/eSZ3QFH3GACFWUqwaVxWvCT77jLL19UXiqvbTHiPmXkANYD7zPzNYUGgK5m8/nVeWxbBDEwAG3KVct+darqD4hrMTM1w+6IXrFuRpYXzkBl0JZPpX6GtdG2+tXQ/6O4X4KpwQzUQBEjJxurw5Jid/BlmEySzaMsDtCaQbwHl/nxb5/2ZcGUR8ZR4z8ecNwAstJb+dxAq3gqgw9Sn5NR3OmLAMGhRsDKxsZbW9msSkYcBvto0naBLmgHsh/lfyI03rsmNN64B3cuhtgdEzsxoYr9xAS5oygbuLFImADOntwEGijg1/9C0GNT7EEUDYPRyewhYzEjZ0FI88DMhYumagyiwywG365Fi/iahuxCAM9NqU2q/GgZ67ynS0F4PACrj31TTMZCOZINC1tZ991kS1Q0OgBhynya4BqYaxHLiqsrg7ruyY01PEQkasNMD8E5r7zLoCGAUylpNdXM2uec4ygo3p+bl7ataip1fJN29FF4F8zUDAIoz6GMK/QJMr86Nj6/OjTeuDv+d/pnKlxh4rVp6p5l9JxTzGmDqBbgqE67thWVrL64Tb5njeaeF4uq2QrHzIYh8GmSHqSopACWB6V302pUbbyolR3OrR8uL/j4bQwtiwSM5B5+ZTY4NiXFka8hPtAZKg6m/LyFuHR4c2Dv17mEcaVnZcaNRtgNqInL14eXNL8VhPHpMDn720VWaL3b8JikbTdVThJkg8fioqccDkMoh90i+mD5G8CJCWtTSawD89VxFo4tWri4p+FE1P0pIzaD3Hj48sH+G/gIXu6Mjwz7ZB8i6zBy+CsA9szjRE2BnLd/asUXEXWPej1Nco6q/YeTg3j5gfQOwa2IGf0iBrmTkYG9fc7H0VwJcB7DBoBsBbJn7G/jOWqFt7Wth7k9AWW2ajoOuEWAKs38yk09Xh3IPzeC7/AjAYwC+3LRs7YtcznUT+nNG2RikWb3QbbKc+7eWYulPvefvjh3a/T/Z9ZzNcgKZHLeFtnUvhupnKHKJaToGSjOAMZj+qVfrOXqw/2EsYM5BhNUtoTp75G5SVsF0nJI0wOxzlXJfd2ZsuzpTUhblRr9ppo8BdADhxV8ZXpuVyECAHr+4tX0twdtg5ikiqvpvlUO7H5o83hP7XbtSwv4WwD7AAHID0N44GdHMYnQlwIacl9zdJJsIyZnpfnH8MHCbzODzDOhyBw4cqAL43mSaAsGi2RsDIQptaW2/hiI3B7GSRjO9pzrUf094fUZidYzIEniYlAYzVUBes2RJ54WZOM/y2J1KAbVQLH0ASB4EsNrMe9A1mup2EDdWyn1vqA499tXwXbqSurF6on8SXu9Kjh55fF+l/NiW0XLfa2F6tQLbQ6RmAJCHyHvF8V/zraXrZzfaOuZ7bYPZf0B4iVnqs4xmL1N91Wi57+YgVt3uad/p+SxYISLKt3ZsJmWzqZ+guCZT/7FKuW9zCMWnVk4yT6NLDhw4cBTAv5ISzEzhr7a1tTVnF5ZnLwagJ3+RlBwMKUAK+GenTpfKBKBmPEzyRaa+JuS6lpX8yXDss+WxTRrYk0a7nyClkbTfDVX2p7fnjuAjwVNRQHnJLJ1HAXp1SbFjjYp8GmYk2aimfZVy37vCuThdEQ/vL1hyr5rfi1C4tazWYB9AVis3ixG/HJMCitsC04lwRjhu6jdXh/qurgz2fSl7v6tLbf3TfLineXLw0+c3eHeVcv/26uDuq2F2lZn9Fyk078dAu5DCzxWKpVvQur6lzts6iwWD3rTQtvbifLH0RYrbDChhloIcg/cf0tRfMXp4YFc29yYzlvrv9LwVLAF6/PLl7atI3m3q07BkrfdVyn2/EQb1zhN4G0UDoM5jm5lNAFCCLaPp0lfOomFsSqzM7ukNav6JRcnItkkD+SQTSgEgR+sx0wkEE4BKWTOLvhCBXl2y5IKlStxq5i2Y0P6eSnngC2eSEtO4L/vRk2yppEtedGyqfibHeBsQ8vptAmkDoEZ7Mgd7fRj8PWcy+A3ockNDu0YJ3kUKg1jzppaVHZeF7322N4WuZFJYCsXSJsm5XlCuM/XjoVbMdjH1r6wO9X9uOlqaWt07g+8z5d25IFx9D1Qbqq8085+nyzXDDDCtkfLJAvyfFdrWvLgumnQzvEacjqq6paWt9E5T+ZSIu858Oka6hJTEVN48OtT3iazGSjKPdkEXjc6nYDGLZNzRxG0hmYA0M/shUfvl8PrJBnVPEAbY9w06DkBI5iiZwJydMAjQmy5btubHaPIWM1WSFOMnQvrUJacYmAp0u+Fy/xMGe4SkC3rnu2Y3fYamjQ1fFMqFABiilkXvCqlgz2nUe2WmvNr3zKwajpV5CF9cF2meyXV1wO0sFDs+J5TLswgwgffvC1uWus5iy1KvAmBCfMVMK9liQQLBRbNgCQjQm+ZXrju/UCz9BSjbYbbGLE3JLJV1I68M0cdUwehsTWg/FT3t3z9WKfdvNvWfALCPkuTM/Chor4UlOwvF0vvrPttOIVycFtTetNB20cX54nf+HHB/DHC1qU/pXLOZ/YvBvzWktesb8CzrjTZPghUqaQvF0s0i0m2q4xSXo/mPhP1sG5JnOGl0blgB/HDyWin00tk6B+O5ZCthBYBU6J5Fycg9p46ujr1zEvh3M+wLt1G+un1WfKxQZpFvbX8d6X46EwLA7Bvhbvh37jTv8gYAhWR4n5mNTA5uhb367Ez23jTf2nEHJXd9VvnfcOzq6lmtLinQ5YYH+/Ya7B7SOVM9qsYbC21rVmbnmGcgsgkAK7R1vpdi/wrgEphPwyZsmVD1myvlvhsQPL85LO6cSsVZKe/+kK/5y6D+LoCOlMWACem25oudDxSKpU2ZwGTCFWoCw3Xsnor8Fr1g3YoQVaV3isi1pumYOLcGZGKqt1TKuy+vDPbfG77Xrgk8yxo5zoNgBf+iZWXHFSDvyFaOmlT9faNDS/74+JKBk6UGQ6PHGMbEi2bhu9uSJR0XEnxjCDhIqH1lBtFVvY9lx/pY0vlkq7zi7H2sPdnn8/r6U0Fatqq35nQHmgFdyeDg4JgR3wyTEzRi3RmOAwfsrC1aubpEyi+ZpjWQjQAgitvC35yNmrQs9R7HJ838BIhmce7VNHfZ5Ng4vWPuluzm+VnS3QnYagDng5Io7AHU0lfVpYDz0eRw0qtNjh55fN9oue9mpvoKNXuQTBKz1AtxJcjt+bb0m6F2a33DdE0gwk6F5e2L860dmzX1W0H3xwQvnIqqVB8G9K2Vct/WOlP9Wdlxdr5SQlPB7QQdiMRge0IquDM9df3QcZc2RDGhxcuLW1tbW87wLjuZAlmtEb/CLHQxs6MJ9A+OSaFmMploPWY2PuVjwd58lumqADt9vnX9eaRcZja5RUUfqpQH7j/Lcg4V4PvBd9cqDa9YhVWNp2m8C7J6HnUN/wigIfwux8z0+tGD/TuCKT4rW35C6j08mXoLTb1X8HdWYVXzDP03mY6Ueny+rfR/QdlsPh0DUANwCIZfqA7uvqpy5PH/wik34c8V08b86OGBXdXy7k1m/hZAxi3MIE/wx0G5P1+s/WdLsfPLhWLpA/nWdZsLxY4/ySeyU8RtA3ilaZpSpD6quiJEVWGnxLPBqzpHgpU1mFuxdqNQukIlrTh6/46QCnadltIL5JG67OaFqnqmGzIF6E0Xt65tJ3hD8K7Emem3nhp6fM9kgd2MJ1O5/wmDfpOks1Cp/3NnV97QHe7srH2K5OqwVcLGnJeb6vy+MzcUjf+eTfLDJFccKTa95jQWMCb9yLriUJsASTP/pkq578/qJsZsoqK4zWAeZip06w+3Nn8kTPT1uROIVubpHLOsvylf7HxA4N4XymmkmZQcTW+qlCf3y53T/X1WZ7JLpdy3FbX0VWb2PVAcpoRL1oHsJmULadtAeQfBdgtp7QtBSUz162p4Y4iqJk37Z38zxLkULGZpjTPnbgdIikvU/NdGDw7sOD1/I0stjEPTK4XSOM5lLz+Nifb06Ape3I2kNGelDMhKGfT0IqNQ3kDwLyc3tBN80aIV7kKcUS1Nvci7t5j6CbokB9hvjhzavft0Rf5EESEV3zHTKohVJBMjb5h5RLg+N+1HumtM/Rida4LZB6tDA1+dTldmk7B7YPRg/w5TvZPicqbpBEVuDnVLk/Vdx3s6QG+6qHXtpfli5wMgt5O40iytUVyjmn7NULtydGjgvrrxuBBSpantOpUjj/9XtZxsgOnVBvsuKG5quw8sxLUgwpYaScz0ETV7U2Uo2RgeODIl2B7PAeawMCzbrb+y9H4mbqul6ZMQaYK3N1cO9T14mmkNAVhra2tLhcv2EVhKCqDWPTq0+74zMHcFAPLFjq8Q/GmQicH2LpGRH89qvk5nGT40+yt2rEnB75thWIRLVfHu6tDubad5bMyqxTVfLD0o4GtAipr1VMu733qaPZhOeV3yxdKdQvllM6NBH2stT7zsB/jB+Kn/dlYTtrLjcnPyNailoTjUf75S7r9xdo7vVOemW1bh6w2Hi/lvEWwH1LJo4obqUO6LxxSmtv1EocXGXkeTdiVuBOwihFIOZwBMdWt1qP+WaW9rwU7oulW89Q0t59VerYb/JSYvVLPlBBaR/IHBHqXYztEnc4/WnQf3XBGqSZK5O8m9acvKjitM+NFQcyUr1fSu6qH+r52pBzMxkU/QaOnTVgrvO0OzfXUKvh6AEKSpfuXA4IHqGYifAUATnxocscUjBBcBcKC+HsDnTlNMHNBbKxRLHyDlCjPvYaw2pXpLNUQLMlti4FT+2RzeC6gSsvpHSxpegGHsxYmXubOq5960UCxtMuKPYEZkxaHVcv87w+/0Yg59HwOA/dg/1qLt74HLPWShLYKnyLZC0f+aWec/APguqZebHb0cTDqMBqiOQQiATmEPEPbR6lD/gzi2G8NCRTFV3LprYvRJ7ACw45kXF547UdVcp4QEgPPPPz9vwj8H0AyABgxqqluzEP9MigiT4eEfDAPcka1wneFKYb3ZLsmZme3HH9vg4OAYgAcp0mRmAuDK06winxJ5gB8NfkTiDHZP2C+4ITc76UpYpJBa9RE1fQIhnWisNeJXwnfZ4E4w+CeLK7eRsh3A2swMG3Fa+7nMuBbMuUkdikVHDw7sMPOfBehBumyD9ToR3kLis5mn02Hm1WCgc800+xpMr6oO7r6qMtj34LMsVZosVq3z5ab8Nhxb4jAlwM/JPvhzIFjBY3kqbXln2CtoRzND+0tHjzy+bwY1V6e+cDY5+Q0AWsNELp5G+tabLmkrrc7Mdn+GZvuJTWGTHky1+5VC1edfOMPU++ki3wSQZn6fpfgIslXD2Rv8XW54+L+PiOETpBNTXyPkXUEsd9bCgsHUJPA4//x8oVj6KMVtNtNxGDzAUfN2XdjUPJ9GdY8CYKXc9w4AGzJfR0ge7+mANRh2mPo7Rst9V1bKfQ88yw3oKV/uWL+tvsThuf3Ajjkz3ZX2U5kDnTPTWo74/dmYeCT+BZhqQveKJUuGWmbehC6Y7TW195KSh6F25mb7cVELeJQPquqYmR0kkfNsuLT+c59B5G0kXXTDsSJvPWOH+3+YRT2zaAb3egCyKBm5R833gZIDkFPh3cuWrVkCDIxPToJCsf3qvF/8TVJ+3bw/CrIxHBu7qwf7/6EuUpnPSZuJ1u7vVgeTV5B+o8JvMegDUHsUZl9W+C3i8ZJKeXdXpdx363R08txMlZ4vJLMvgL1++fL2VUfhLjPT0IzP9LawTePs28HQ4/GpoyYmQrY5U7JIjHgVYAayyUz3L05Gto3OvLL9pORyac1TxmksAJDT9LFMYW+XECUkZjY2WyJ/4knfLQcO9FRbVra8yxwfDAY6SxMNyTcKxY6/DOdJSmZ6BUzNIJalu/1G/+HqUP9Xz3HbXKvzdXqRGWgniV4nI8AoVDHCqie0GD6a8PeEXEoKzfSharn/I7NWmyNsqB+MIm6GgjVZLtC5USiXmBkBq1LtbVnbFZxFOG1AV3L48MAIYA9QpHnSx2ptbc2f2sfqdtn2ls0U+UlTnWBYnv7Ds9+L90x+UF2pgEsaYVqDsYN0HyLdhwi+ieAyEbcSwJiq31pxT710emvHOU+r9Fhf5zhPR+r8n0gUrJMJgrs29IS22uxu0wBMkasTF9ZqSW6GE9Ta2toKJvpOUxsjHQy2bfRg/8OzmNbYlI9llhKy5CiW/0R2fuTE57/HL1rR2Uny7qw/fIOaPlwd6v9gXSO3OaLXA92uOvSCW03TW0DJTXpBllV2UJyo6b2i8tLqUP8t2f66hbS1o87XOc7T0TjFo2CdevSEFsNGOmfQu8M2jS45++gqCB6p+81sAmZeKIvRbFfU+UCnEFNoVZe+RETeDlqTmaYutc/PnphO+1ih3QwOhuWayU3a5RNUYm9wAJx39hmSCQA16JM52A1hsvXO9fYQC9elN62U+7Z6r1cobKtBH4DhG6q6BZr+fLXc99bwtJepvuMxYok8mz2s6eiK5MbwxBCbyI3jk3jGfuMzTmEUABrt8LfGsHyc5KJs2s9gQpcJQDxwmYSSImdmg01u+HsjgAI9s9YMrqVleGzYtxwg5EILNQPvAdbfCRSfNsnX54CdE1M1V+onKEmD+Yn3DR98fM858Idc1h734ZPf3J79WzsiMcKqi67st0NHAYHBHhke7n9isqfTbAmCiBjq28wYLp+x30G9PERpYkbsHBoaqtY1cZuFaCW0IRbj75FkKMrki1pWpGuyCDOLAjfkgF0TLa3t14C8I+u8GhrzzU5bljPBn8ILmo+uBZHIvAhWiK6KHVcRuDQ81sk0e4DDbA7yM20zM1mQeTkhl4fe4KCY/dPsT8KpcoFtarofEAKWWMK/W1LsWAPA0N7eGB5y0HGd0f0RzAyUBjXdHRrznUk74dkUrRN6QRanSuS5Ilh6AS5oMuDTABxJp6Zfzx7g4ObkqcIzbzNDAFi1alWzCb9AYikAqvm9i5PRP8nSVT+rR4ZuHjhwoErFrzI8E94TXFsD/xEbNjgMDIznW9tflz1gdFkmBkedn3hjKNrssSgQkcicCFZoUHd4WfPLhFLKnhYJgn9R5x3NwUHPtM1MqLo/crTwblJWmdpRUgjDZJM+N/viELaPVA72fUnN91KSBlM/RkqpsO+pv80XS3eR8hUzTQHzlCQH2G+MHHpi9zkowoxEnk+CFTpu+px/O0CCEDM76kz/JkspZnnyTbaZ8TNsMzNKADDqhZiuuq/kiE9j1hYDTihaBnS7HPAOM91Lcc1QHQflp4TyywCawqqgmGl6T6V8/l1zX8IQiTy/BUuA3nTp0osuOH5f3sDes9yXdzIhyFYKj/xH3QMpGkDXeoKIjsDPemBDDsRPmykYngP3uawgcy5riRToseFy/56Etslgj9K5xhATGiiOangQ5Msr5b4bglD1Puf3gUUi51CwQtfJiVz6a9m+vHR29uU9I8evFIYHKTzt87oFuF0LxZG7hW4dADWzsdy4fGJuo6t60ep2w4N9e92Y+xlT+xWDbYfhG6b+jmp596bK4GPfw3Q1dhSrSGSuRAMI3QXyxdLhQrFkhWKn5YulJ84///w8pvsMzQHhwZL5Ysd9LW3rrKVtnTUXO/62/rVJb62ltf2alrZ1VmjtmGhpW2f51o4tx77vnN8UJA6lSGTOI6xuAcCRWuGVBFtgViNpAvvYzJ84c5aKqbIDCE9SEOOKQrH0EyFq2pADerR5efsqo9tqpilFnJrumJ/tLieKtKaf+vs0wYwGeyQy94IVzHYV/nZ4qKnLmepnRsv9n5n7oscgNo3qt6npIQCkuEvMbDMARVeLATAmspXkqlD7QKH3twHwmXE/3+mXHV/fFIlE5oGQbuWLHb9ZaOu0QrFk+WLpyNKlF10wf2lOqL7OF0t/0dK2zgrFUlpo6/zvpvMuugCAFIqdH2tpu8gKrR1jhbZO31zs+Mf6Y49EIs9OTtdnEgC6bNmaH5vIJQMAhBTxlv7DWHngZ+dvS8nk3sXSJia839TGKdJk6vcaWBWRi818DXQ5mHnU0pdUjjy+C3GLSSTyfEoJs5XBBvdbpOTCyiAoxn+e38POijMP9T2gpjvokqYgUFxN4cWmfgKUHMz6Ab0+iFX3HPWVikQiCzHCIgBbhVXNh4vN/0FwHUAz6BNL3OiLDxw4MJa9b778IQFgi1vb1yjdRw32lmzTNQiBmt/VWEsvPXJkzzBO/CSYSCTy3I2wwsrgkRX5Swk5L6wMCgneNXfbXE6JArCnhgYeHy3vvhawt8HswVDnlN4uDl1BrOJ2l0jkeUh9/dNFViiW0nyx80dL2kqrMd03+xxFiSetq2K8bpHI8zQSW9JWWp0vdv6oUCylLW3rLF/suK9ezM4xrk40XRSrSOR5mxKGx1SlhjcJZQnMNPS8Yvbw0eJC2Fbi61K/uC8vEnn+ClbRAIjBfh5QgJJTs72VQ307QiTTE7sMRCKRhSBYoeZpUWvnqwl5ZXjiDBVmfwOgduqHP0QikcjsMQPvKXRd8LTrnMs1mHoYDAns98PrvXEFLhKJLBTByh6vBfy1eX+eQQlgJPS8ipXjkUgkEolEIsdxOkv/MrlaGLtjRiKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSOSM+P9LKPoj45K25gAAAABJRU5ErkJggg=="
    },
    "final_document": {
      "name": "Board memo - cloud contract.pdf",
      "size": 103,
      "sha256": "2df7e602ebf9f09606a0a9f30bd6ea852065c216793b99f2797707aeb512e54d"
    },
    "previous": {
      "profile": "riftveil-decision-v2",
      "verified_by": {
        "last_name": "Lambert",
        "first_name": "Elena",
        "role": "Chief Financial Officer"
      },
      "checked": "The prices for years 2 to 5 of the three offers, with procurement.",
      "questions": [
        {
          "n": 1,
          "question": "What does leaving the contract cost if the price rises after the first year?",
          "suggested_owner": "procurement",
          "assigned_to": "Daniel Murphy, Head of Procurement"
        },
        {
          "n": 2,
          "question": "What are the prices for years 2 to 5 of each offer?",
          "suggested_owner": "procurement",
          "assigned_to": ""
        },
        {
          "n": 3,
          "question": "Which workloads cannot move before the current contracts end?",
          "suggested_owner": "CIO",
          "assigned_to": ""
        },
        {
          "n": 4,
          "question": "What internal effort does the migration need, beyond the vendor's support?",
          "suggested_owner": "CIO",
          "assigned_to": ""
        },
        {
          "n": 5,
          "question": "Which service levels does the contract guarantee, and what happens if they are missed?",
          "suggested_owner": "head of IT operations",
          "assigned_to": ""
        },
        {
          "n": 6,
          "question": "Who will answer to the board if the saving is not there in year three?",
          "suggested_owner": "",
          "assigned_to": ""
        }
      ],
      "decision": "conditions",
      "conditions": "Contract signed only after the exit-cost analysis, presented to the board.",
      "place": "",
      "signature": {
        "method": "drawn",
        "typed": "",
        "image": "data:image/png;base64,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"
      },
      "decided_at": "2026-10-26T16:05:12Z",
      "proof": {
        "fingerprint": {
          "alg": "sha-256",
          "profile": "riftveil-decision-v2",
          "value": "2fd3a2ae0b4685c971c0cb7e780bf97736d02ff3f25f3e42ad953cfa180115c2"
        },
        "seal": {
          "value": "S1-SP2R-M6Z9-3Y27-M5MB-YB16-57G7-MX47-8GFY",
          "sealed_at": "2026-10-26T16:05:12Z",
          "verify": "https://riftveil.ai/api/verify"
        },
        "signature": {
          "alg": "ed25519",
          "key": "ed25519-1",
          "value": "H0tFeR7Q-VELQlHZEsR9AkvBDaKZmP2Obc7CuPehNrHaA5XHmRtrPcSsOHsPStb1MU6BcQKTS8MVWHaKDlUmAw",
          "keys": "https://attestscope.ai/test-keys.json"
        }
      }
    },
    "decided_at": "2026-10-28T09:41:27Z",
    "proof": {
      "fingerprint": {
        "alg": "sha-256",
        "profile": "riftveil-decision-v2",
        "value": "137a5d48553a886223ef5392e910d1e16e7d46aebb82e5fa8bef058963ff7522"
      },
      "seal": {
        "value": "S1-30WH-D58W-8MVE-6G4Y-8KSE-30J0-G3YC-RX4S",
        "sealed_at": "2026-10-28T09:41:27Z",
        "verify": "https://riftveil.ai/api/verify"
      },
      "signature": {
        "alg": "ed25519",
        "key": "ed25519-1",
        "value": "Nk-dIGehodcncNA9pOvyC3KMAjeoXkHQIEggGaVoZAobxLkHL8FmUMYx61uwYrl560NvoV0pVAAgerL-cWvsCQ",
        "keys": "https://attestscope.ai/test-keys.json"
      }
    }
  },
  "notice": "Illustrative record. People, organisations and amounts are fictitious. The prefix XT is reserved for tests: the seals use the public test key assay-test-key-1 and the signatures the public Ed25519 test key of docs/test-vectors.json; they are never valid at riftveil.ai. The final document is a short text given in docs/test-vectors.json."
}