LIVE · AUDIT-KETJU · EU
JÄRJESTELMÄ · 99,99 % KÄYTETTÄVYYS
v 1.0 ↗ TEHTY EU:SSA

Käsitteet

Mitä Session, Evidence-rivi ja auditointiketju oikeasti ovat, mahdollisimman harvoin sanoin. Lue tämä kerran, ja API-viittaus käy järkeen.

Organisaatio

Ylimmän tason tenantti. Yksi organisaatio vastaa yhtä asiakastiliä. Jokainen muu resurssi (istunnot, todisteet, auditointitapahtumat, käyttäjät) on rajattu organisaatioon row-level securityn kautta taustalla olevissa Postgres-tauluissa. Bugi sovelluskoodissa ei voi ylittää tenantteja — tietokanta kieltäytyy kyselystä.

Organisaatiolla on: jäsenet (roolipohjaisella pääsyllä varustetut käyttäjät), brändäys (logo / värit / PDF-alatunniste), laskutustilaus, valinnainen KYB-oikeushenkilödata, valinnainen SSO-konfiguraatio ja säilytyspolitiikka.

Jäsen, Rooli, Oikeus

Jäsenyys on Käyttäjän ja Organisaation välinen liitos. Käyttäjällä voi olla jäsenyyksiä useissa organisaatioissa ja hän voi vaihtaa niiden välillä (aktiivinen organisaatio kulkee JWT-claimina).

Jokainen organisaatio kylvää neljä järjestelmäroolia luonnissa:

  • org_admin — täysi hallinta. Laskutus, jäsenet, brändäys, säilytys.
  • inspector — voi tehdä tarkastuksia, kaapata todisteita, allekirjoittaa raportteja.
  • observer — vain luku -pääsy istuntoihin + auditointidataan.
  • auditor — vain luku -pääsy sekä ketjun todennusoikeus.

Organisaation adminit voivat luoda mukautettuja rooleja kokoamalla oikeusluettelosta. Oikeudet slug-tarkistetaan näkymäkerroksessa + ristiintarkistetaan RLS:llä DB-kerroksessa.

Istunto

Yksi tarkastus. Laskutuksen yksikkö (maksat per suljettu istunto) ja todisteen yksikkö (auditointiketju on istuntokohtainen, ei organisaatiokohtainen).

Istunnolla on: operaattori (tiimisi jäsen, joka aloitti sen), yksi tai useampi osallistuja (kenttäkäyttäjä sekä valinnaiset tarkkailijat), suostumustila, valinnainen GPS-sijainti, valinnaiset muistiinpanot, auditointiketju ja — kun suljettu — TSA-ankkuroidut aikaleimatokenit.

Osallistuja

Yksi henkilö istunnossa. Istunnossa on yksi operaattori ja vähintään yksi kenttäkäyttäjä; valinnaisia lisätarkkailijoita tuetaan. Kenttäkäyttäjät liittyvät kertakäyttöisellä allekirjoitetulla URLilla (ei tiliä vaadita); operaattorit + tarkkailijat ovat organisaation jäseniä.

Todiste

Kaapattu todistuskappale istunnon aikana. Lajit:

  • snapshot — still-kuva kenttäkäyttäjän kamerasta.
  • annotation — piirros tilannekuvan tai taulun päällä.
  • whiteboard — istunnonaikainen Excalidraw-kanvas vietynä PNG:nä + tilana.
  • clip — lyhyt videopätkä.
  • document — ladattu tiedosto (chat-kerroksen käyttämä PDF-allekirjoitusta varten).

Jokaisella Evidence-rivillä on binäärisisältönsä SHA-256, tallennettuna auditointiketjuun. Tiedoston peukalointi jälkikäteen kaataa todentamisen.

Auditointiketju

Kryptografinen selkäranka. Jokainen istunnon tapahtuma — istunnon luonti, suostumuksen anto, GPS-tallennus, todisteen kaappaus, annotaatio, taulun tallennus, allekirjoitus, istunnon päättyminen — luo AuditEvent -rivin, jossa on:

{
  "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>"
}

Ensimmäinen tapahtuma käyttää prev_hash = "0" * 64 (genesis). Jokainen seuraava tapahtuma käyttää edellisen tapahtuman hashia arvona prev_hash ja kasvattaa arvoa sequence yhdellä. Postgres-advisory lock sarjoittaa kirjoitukset istunnoittain; vain lisäävä trigger estää taulun UPDATE- ja DELETE-operaatiot.

TimestampToken (TSA-ankkuri)

Istunnon päättyessä (ja operaattorin laukaisemassa "leimaa nyt" -toiminnossa) nykyinen ketjun pää lähetetään kolmelle riippumattomalle aikaleimaviranomaiselle:

  • YodaLedger — Tezos-lohkoketjuankkuri. ~15–20 minuutin lopullisuus. Asynkroninen; saamme callbackin, kun lohko vahvistetaan.
  • FreeTSA — RFC 3161 -aikaleima. Synkroninen; token palautetaan välittömästi. Vaihdettavissa maksulliseen QTSP:hen (DataSure) eIDAS Art. 42 -yhteensopivuutta varten.
  • OpenTimestamps — Bitcoin-ankkuri OpenTimestamps-kalenteriprotokollan kautta. Asynkroninen; päivityspolku ajetaan Celery-sweepillä.

Kolme on tarkoituksellista — jos jokin yksittäinen TSA katoaa, kaksi muuta ankkuroivat silti ketjun. Tarkastaja voi todentaa mitä tahansa niistä vasten riippumattomasti julkisilla lohkoselaimilla / verify-endpointeilla.

Allekirjoitus (SES / AES / QES)

Kolme eIDAS-tasoa, kaikki samalla audit-raportti-PDF:llä:

  • SES (Yksinkertainen sähköinen allekirjoitus) — auditointiketjuun tukeutuva, ei allekirjoitusvarmennetta. Sopii sisäisiin tietueisiin.
  • AES (Kehittynyt sähköinen allekirjoitus) — henkilöllisyyteen sidottu allekirjoitusvarmenne, PAdES B-T -ankkuroitu. Sopii useimpiin B2B-sopimuksiin.
  • QES (Kvalifioitu sähköinen allekirjoitus) — korkein eIDAS-taso, käsin kirjoitetun allekirjoituksen oikeudellinen vastine koko EU:ssa. Vaatii antajaorganisaation KYB-todentamisen.

Kampanja (valinnainen)

Istuntojen looginen ryhmittely eräraportointia varten — "Q2 2026 ajoneuvokorvaukset" tai "Kohde A luovutusviat". Istunnot eivät vaadi kampanjaa; se on raportointimukavuus.

Webhook

Asiakkaan rekisteröimä URL, joka vastaanottaa HMAC-allekirjoitettuja tapahtuma-POSTeja. Tapahtumatyypit: session.created, session.completed, participant.joined, participant.left, evidence.added, recording.ready, audit.anchored, signature.completed, sekä webhook.test toimituksen varmennukseen.

Allekirjoitus: Stripe-tyylinen t=...,v1=... -otsake HMAC-SHA256:lla kohteesta <timestamp>.<body>. SDK:n constructEvent() -apufunktio varmentaa vakioajassa 5 minuutin kellonpoikkeamatoleranssilla.