Bonverkenner
Reken een bon na in uw eigen browser.
Hieronder ligt een voorbeeldbon, al geladen en al gecontroleerd — u hoeft niets aan te klikken. Drie waarden daarvan zijn zonder sleutel na te rekenen, hier, in uw eigen browser: de invoerhash, de uitvoerhash en de evidence hash van het vorige ketenevenement. Plak uw eigen bon over het voorbeeld heen, of verander één cijfer en kijk. Er gaat niets naar ons toe.
- Wat er gecontroleerd is
- Bezig met rekenen…
- Invoerhash
- –Bezig met rekenen…
- Uitvoerhash
- –Bezig met rekenen…
- Evidence hash
- –Bezig met rekenen…
Verander een waarde en de drie controles lopen mee terwijl u typt.
Voorbeeldbon in het productieformaat: verzonnen waarden, geen echt gesprek.
De drie controles
- InvoerhashBezig met rekenen…
SHA-256 over de ruwe UTF-8 tekst van sample_texts.input.
- Hier berekend
- –
- In de bon
- –
- UitvoerhashBezig met rekenen…
SHA-256 over de ruwe UTF-8 tekst van sample_texts.output. Verdictregel (F21): ALLOW: uitvoer gelijk aan invoer; MODIFY of BLOCK: uitvoer verschilt.
- Hier berekend
- –
- In de bon
- –
- Evidence hashBezig met rekenen…
SHA-256 over de pijpstring van preceding_event: event_id, call_id, sequence, event_type, timestamp, canonicalJSON(data), previous_hash.
- Hier berekend
- –
- In de bon
- –
Authenticatie en Merkle
Wat op deze pagina niet nagerekend kan worden.
Een bon draagt een HMAC-SHA256-authenticatiecode, berekend over de signeerpayload onder een sleutel die Audact beheert. Narekenen vraagt precies die sleutel. De signeerpayload — het versieprefix en de bon zonder het signature-veld, gecanoniseerd als RFC 8785 JCS — wordt hieronder getoond zodat de structuur zichtbaar is.
Merkle-insluiting wordt hier niet gecontroleerd: de verkenner bevat geen insluitingsbewijs. Het bewijs zit in het artikel 50-rapport van het gesprek en wordt gecontroleerd tegen de wortel gepubliceerd op api.audact.ai/v1/metachain.
Verander één cijfer in de bon en kijk hoe precies de rij die eraan hangt gaat afwijken.
Zonder deze pagina
Dezelfde drie controles in een terminal.
Dezelfde drie controles in een terminal. Tegen dit bestand drukt het script drie keer ok af.
De canonieke vorm is het stuk dat mensen overslaan: twee JSON-teksten die hetzelfde betekenen kunnen verschillende bytes zijn, en dan verschillen de hashes terwijl er niets veranderd is. Sleutels alfabetisch, geen witruimte — dat is de RFC 8785-volgorde voor de waardetypen van dit bestand (tekenreeksen en gehele getallen). Hij staat uitgeschreven op /sample-receipt-readme.txt samen met de drie herberekeningen en wat niet nagerekend kan worden.
import { createHash } from "node:crypto";
import { readFileSync } from "node:fs";
const r = JSON.parse(readFileSync("sample-receipt.json", "utf8"));
const sha = (s) => createHash("sha256").update(s).digest("hex");
// Canonical form: RFC 8785 (JCS), prefixed `audact-receipt-version:<receipt_format_version>\n` for the authentication code.
const canon = (v) => {
if (v === null || typeof v !== "object") return JSON.stringify(v) ?? "null";
if (Array.isArray(v)) return "[" + v.map(canon).join(",") + "]";
const keys = Object.keys(v).sort();
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
};
const e = r.preceding_event;
const evidenceHash = sha(
[e.event_id, e.call_id, e.sequence, e.event_type, e.timestamp, canon(e.data), e.previous_hash].join("|")
);
const results = [
["input_hash", sha(r.sample_texts.input), r.receipt.input_hash],
["output_hash", sha(r.sample_texts.output), r.receipt.output_hash],
["evidence_hash", evidenceHash, r.receipt.evidence_hash],
].map(([name, got, want]) => { console.log(`${got === want ? "ok " : "FAIL"} ${name}`); return [name, got === want]; });
process.exitCode = results.every(([, ok]) => ok) ? 0 : 1;Waar dit thuishoort
Een bon is wat een gesprek achterlaat.
Elk bestuurd gesprek levert er een op: wat erin ging, wat er besloten werd, de beleidsversie, en de schakel naar het gesprek ervoor. De keten wordt alleen aangevuld; een latere wijziging of herordening wordt zichtbaar zodra de keten opnieuw wordt berekend tegen het bewaarde commitment.
Artikel 50 van de EU AI-verordening geldt sinds 2 augustus 2026. Het is een transparantieplicht: mensen horen dat ze met een AI-systeem te maken hebben. Een bon is hoe u achteraf laat zien: de goedgekeurde openbaarmakingstekst en wanneer het audiobericht volledig is verzonden, welke beleidsversie gold en wat er is besloten — invoer en uitvoer als hashwaarden, niet als woorden.
Verder
Zet uw eigen gesprekken hierachter.
Een bon als degene die u net hebt nagerekend komt uit elk bestuurd gesprek. Bureaus draaien hem voor hun klanten, organisaties voor hun eigen gereguleerde werk.
