LIVE · AUDIT-KJEDE · EU-VERTET
SYSTEM · 99,99 % OPPETID
v 1.0 ↗ LAGET I EU

Konsepter

Hva en økt, bevisrad og audit-kjede faktisk er, med færrest mulig ord. Les dette én gang, så vil API-referansen gi mening.

Organisasjon

Toppnivå-tenanten. Én org tilsvarer én kundekonto. Alle andre ressurser (økter, bevis, audit-hendelser, brukere) er scopet til en Org via rad-nivå-sikkerhet på de underliggende Postgres-tabellene. En feil i applikasjonskoden kan ikke krysse tenanter — databasen vil avvise spørringen.

En Org har: medlemmer (brukere med rollebasert tilgang), merkevare (logo / farger / PDF-bunntekst), et faktureringsabonnement, valgfrie KYB-juridisk-enhet-data, valgfri SSO-konfigurasjon og en lagringspolicy.

Medlem, Rolle, Tillatelse

En Medlemskap er koblingen mellom en Bruker og en Org. En bruker kan ha medlemskap i flere orger og bytte mellom dem (den aktive orgen følger med som et JWT-claim).

Hver Org seeder fire systemroller ved opprettelse:

  • org_admin — full kontroll. Fakturering, medlemmer, merkevare, lagring.
  • inspector — kan kjøre inspeksjoner, fange bevis, signere rapporter.
  • observer — skrivebeskyttet tilgang til økter + audit-data.
  • auditor — skrivebeskyttet tilgang pluss tillatelse til kjede-verifisering.

Org-administratorer kan opprette egendefinerte roller ved å sette sammen tillatelseskatalogen. Tillatelser slug-sjekkes på view-laget + kryss-sjekkes av RLS på DB-laget.

Økt

Én inspeksjon. Enheten for fakturering (du betaler per lukket økt) og enheten for bevis (en audit-kjede er per økt, ikke per org).

En økt har: en operatør (teammedlemmet ditt som startet den), én eller flere deltakere (feltbrukeren, pluss valgfrie observatører), samtykketilstand, valgfri GPS-posisjon, valgfrie notater, en audit-kjede, og — når lukket — TSA-forankrede tidsstempeltokens.

Deltaker

Én person i en økt. Det er én operatør per økt og minst én feltbruker; valgfrie ekstra observatører støttes. Feltbrukere blir med via en engangs-signert URL (ingen konto kreves); operatører + observatører er medlemmer av Orgen.

Bevis

Et stykke fanget bevis under en økt. Typer:

  • snapshot — stillbilde fra feltbrukerens kamera.
  • annotation — tegning lagt oppå et øyeblikksbilde eller en tavle.
  • whiteboard — Excalidraw-lerret i økten eksportert som PNG + tilstand.
  • clip — kort videosegment.
  • document — opplastet fil (brukt av chat-laget for PDF-for-signering).

Hver bevisrad har en SHA-256 av sitt binære innhold, lagret i audit-kjeden. Manipulering av filen i etterkant feiler verifiseringen.

Audit-kjede

Den kryptografiske ryggraden. Hver hendelse i en økt — øktopprettelse, samtykkegiving, GPS-registrering, bevisfangst, annotering, tavle-lagring, signatur, øktslutt — utsteder en AuditEvent -rad med:

{
  "session": "<uuid>",
  "sequence": N,
  "occurred_at": "<iso8601>",
  "kind": "evidence.snapshot_added",
  "actor": { "user": <id|null>, "participant": <id|null> },
  "payload": { /* event-specific */ },
  "prev_hash": "<sha256 of previous event>",
  "hash": "<sha256 of canonical_json of this event>"
}

Den første hendelsen bruker prev_hash = "0" * 64 (genesis). Hver påfølgende hendelse bruker forrige hendelses hash som prev_hash og øker sequence med 1. En Postgres advisory lock serialiserer skrivinger per økt; en append-only-trigger blokkerer UPDATE + DELETE på tabellen.

TimestampToken (TSA-anker)

Ved øktslutt (og ved operatørutløst "stamp now") sendes det gjeldende kjedehodet til tre uavhengige tidsstemplingsmyndigheter:

  • YodaLedger — Tezos blockchain-anker. ~15-20 minutters finalitet. Asynkron; vi får et callback når blokken er bekreftet.
  • FreeTSA — RFC 3161-tidsstempel. Synkron; token returneres umiddelbart. Byttbar til en betalt QTSP (DataSure) for eIDAS Art. 42-compliance.
  • OpenTimestamps — Bitcoin-anker via OpenTimestamps kalenderprotokoll. Asynkron; oppgraderingsstien kjører på en Celery-sweep.

Tre er med hensikt — hvis én TSA forsvinner, forankrer de to andre fortsatt kjeden. En revisor kan verifisere mot hvilken som helst av dem uavhengig ved hjelp av offentlige block explorers / verifiseringsendepunkter.

Signatur (SES / AES / QES)

Tre eIDAS-nivåer, alle på den samme audit-rapport-PDF-en:

  • SES (Simple Electronic Signature) — audit-kjede-støttet, ingen signeringssertifikat. Egnet for interne opptegnelser.
  • AES (Advanced Electronic Signature) — identitetsbundet signeringssertifikat, PAdES B-T-forankret. Egnet for de fleste B2B-kontrakter.
  • QES (Qualified Electronic Signature) — høyeste eIDAS-nivå, juridisk ekvivalent til en håndskrevet signatur i hele EU. Åpnes bak KYB-verifisering av den utstedende organisasjonen.

Kampanje (valgfritt)

En logisk gruppering av økter for samlet rapportering — "Q2 2026 motorskader" eller "Sted A overleveringsmangler". Økter krever ikke en kampanje; det er en rapporteringsbekvemmelighet.

Webhook

En kunderegistrert URL som mottar HMAC-signerte hendelses-POST-er. Hendelsestyper: session.created, session.completed, participant.joined, participant.left, evidence.added, recording.ready, audit.anchored, signature.completed, pluss en webhook.test for leveringsverifisering.

Signatur: Stripe-stil t=...,v1=... -header med HMAC-SHA256 over <timestamp>.<body>. SDK-ens constructEvent() -hjelper verifiserer i konstant tid med en 5-minutters klokke-avvik-toleranse.