Auto-routing till rätt nämnd, dnr och handläggare.
Modul-ID: diary-ai Version: 1.0.0 Voice: kapaciti (svensk B2B-ton, offentlig sektor) Modell: claude-haiku-4-5
Diarie-AI tar emot en inkommande handling till en svensk kommun, klassificerar den under kommunens namnd-struktur, foreslar ett diarienummer enligt kommunens dnr-monster, identifierar lampligaste handlaggare baserat pa expertis och nuvarande arbetsbelastning, bedomer offentlighetsgrad enligt Offentlighets- och sekretesslagen 2009:400 och producerar ett utkast till bekraftelse till avsandaren. Modulen ar konstruerad for att registrator pa en kommun ska kunna granska forslaget och godkanna det innan registrering i diariesystemet (Public360, W3D3, Ciceron eller eDok).
Varje korning bygger en arkivkompatibel audit-trail. Hash-kedjan, Ed25519-signaturen och de bevarade input-block och output-block enligt kapaciti-modules-standarden uppfyller det Arkivlagen 1990:782 paragraf 3 kraver av systematisk hantering av allmanna handlingar. Audit-bundlen kan verifieras matematiskt aven flera ar efter handelsen.
{
intake_id: "string",
received_at: "ISO timestamp",
source: {
channel: "post | email | e-tjanst | fax | personlig-inlamning | telefon-anteckning",
from_name: "string?",
from_org: "string?",
from_email: "string?"
},
document: {
subject_summary: "string",
body_excerpt: "string (forsta 1-2k tecken)",
attachments: [{ filename, size_kb, mime_type }],
contains_personal_data: boolean,
contains_sensitive_personal_data: boolean,
contains_secrecy_marker: boolean,
document_format: "ankommande | upprattat | expedierat | internt"
},
context: {
kommun: "string",
namnd_options: [{ id, name, scope_keywords: [] }],
available_handlaggare: [{ id, name, namnd_id, current_workload, expertise: [] }],
dnr_format: "string template",
osl_thresholds: { auto_secret_keywords, auto_review_keywords }
}
}
validateInput kastar fel om intake_id, received_at, source.channel, document, context eller namnd_options saknas eller om typer ar fel. Den whitelistar source.channel och document.document_format.
Modellen returnerar plain text i fast struktur. Diariesystem-integrationen parsar nycklarna och skapar diarieposten efter registratorns godkannande.
NAMND_ROUTING: <namnd_id>
NAMND_NAMN: <namnd_namn>
ROUTING_MOTIVERING: <1-2 meningar med matchade scope_keywords>
DNR_FORESLAG: <formaterat dnr>
HANDLAGGARE_FORESLAG:
- PRIMAR: <id> | <namn> | matchade-kompetenser: <lista>
- ALTERNATIV: <id> | <namn>
OFFENTLIGHETSGRAD: offentlig | partiell-sekretess | sekretess-helt
OSL_REFERENS: <kap:paragraf i OSL 2009:400 om ej offentlig>
SEKRETESSANLEDNING: <text>
ALLMAN_HANDLING_STATUS: ja-ankommande | ja-upprattad | nej-arbetsmaterial | osakert
GDPR_BEDOMNING:
- INNEHALLER_PERSONUPPGIFTER, INNEHALLER_KANSLIGA, LAGLIG_GRUND, RETENTION_PERIOD
PRIORITET: hog | normal | lag
HANDLAGGNINGS_TID_INDIKATION_DAGAR: <number>
ARKIVERINGS_KOD: <kod fran arkiveringsplan>
ATGARDER_FORE_HANDLAGGNING:
- <0-5 atgarder>
BEKRAFTELSE_TILL_AVSANDARE_UTKAST:
<100-200 ord>
INTERNA_NOTERINGAR:
- <2-4 punkter for registratorn>
OSL_OCH_ARKIV_REFERENSER:
- <OSL-citat>
- <Arkivlagen-citat>
Namnd-routing baseras pa overlap mellan subject_summary plus body_excerpt och varje namnd-options scope_keywords. Modellen valjer namnden med flest matchande keywords. Vid tva eller fler trafftal valjer den den mest specifika (snavaste scopet, exempelvis Socialnamnden framfor Kommunfullmaktige). Om ingen klar match finns valjer den namnd_options[0] som default och flaggar osakerhet i ROUTING_MOTIVERING. Detta gor det enkelt for registratorn att fanga upp svaga matchningar.
Handlaggar-routing filtrerar available_handlaggare pa det valda namnd_id, rangordnar pa overlap mellan expertise och arendet, och vid lika expertise pa lagst current_workload. En primar och en alternativ handlaggare returneras nar mer an en matchar. Vid en enda kandidat skrivs "ingen alternativ tillgang".
Modulen foljer offentlighetsprincipen som default. Ankommande handlingar ar allmanna fran och med mottagningstidpunkten enligt Tryckfrihetsforordningen 1949:105 2 kap. Sekretess prevas mot OSL 2009:400 vid kanslig personuppgift eller sekretessmarkering. De vanligaste kapitlen modulen citerar:
| Kapitel | Skydd | |---------|-------| | 18 kap | Forsvar, sakerhet, brottsbekampning | | 21 kap | Skydd for enskild i allmanhet | | 23 kap | Utbildning och forskning | | 25 kap | Halso- och sjukvard, tandvard | | 26 kap | Socialtjanst, LSS, ekonomiskt bistand | | 35 kap | Pagaende myndighetsutovning mot enskild | | 39 kap | Personaladministration |
Konservativ regel: vid osakerhet om sekretess vajls striktare niva och eskaleras till registrator med motivering i SEKRETESSANLEDNING. Modulen klassificerar aldrig automatiskt som "offentlig" nar contains_secrecy_marker ar true.
Vid personuppgifter anger modulen laglig grund per GDPR artikel 6 (vanligtvis 6.1.c rattslig forpliktelse eller 6.1.e myndighetsutovning) och vid kanslig personuppgift artikel 9.2.b (sociala omraden) eller 9.2.h (halso-och-sjukvard). RETENTION_PERIOD anges per Arkivlagen 1990:782 paragraf 3 och kommunens dossierplan. ARKIVERINGS_KOD hardledes fran subject och namnd-prefix om kommunens arkiveringsplan ar entydig, annars satts "fastlagg-vid-registrering".
Modulen respekterar context.dnr_format exakt. Variablerna ${NAMND_PREFIX} ersattes med namnd_id i versaler, ${YEAR} med fyra-siffrigt ar fran received_at och ${SERIAL} med "XXXX" som placeholder. Registratorn tilldelar serie vid registrering i diariesystemet. Detta separerar AI-forslag fran kommunens autoincrement-logik och undviker dubbletter eller hopp i serien.
Output passerar validateAgainstVoice("kapaciti"). Forbjudna ord (ensure, crucial, journey, delve, dive, navigate) flaggas. Tankstreck ar forbjudna i hela texten, vilket ar viktigt i bekraftelsebrev som gar ut till medborgare och som arkiveras vid sidan av handlingen.
Varje korning bygger en audit-trail med blocken input_received, context_loaded, agent_call, output_generated, voice_validated, output_validated, audit_sealed. Bundlen signeras med kapaciti-modules Ed25519-nyckel och verifieras med kapaciti-site/scripts/verify-audit-bundle.mjs eller lib/audit-chain.mjs::verifyBundle. Hash-kedjan ar genesis-baserad sa att ett enda manipulerat block bryter verifieringen fran och med det blocket. Detta tjanar dubbelt syfte: dels matematisk integritet for revisor, dels bevisning vid begaran om JO-anmalan eller forvaltningsbesvar dar processen kring registrering ifragasatts.
import { DiaryAI } from "kapaciti-modules/modules/diary-ai.mjs";
const agent = new DiaryAI();
const res = await agent.run(intakeInput, { writeBundle: "./bundles/ink-2026-05-19-038.json" });
if (res.error === "usage_cap") {
// retry senare, claude CLI har natt rate-limit
}
console.log(res.output);
console.log("Audit-bundle:", res.bundle.run_id, "blocks:", res.bundle.entries.length);
Modulen ser inte bilagor i klartext, OCR-laget maste leverera body_excerpt. Vid mycket korta subject_summary utan body_excerpt blir routing-bedomningen svagare och osakerhet flaggas. Arkiveringskod hardledes inte alltid, kommunens egen arkiveringsplan ar primarkalla. Periodisering och gallring ar inte modulens ansvar, det hanteras separat i kommunens dossierplan.
Justera input-objektet eller använd starter-värdena. När du trycker på Kör modulen anropas samma agent som i produktion. Audit-kedjan byggs framför dig och hela sessionen signeras med Ed25519 i samma format som exempel-bundlen ovan.
JSON-payload som matchar modulens validateInput. Starter-värdena kommer från en riktig produktionskörning. Max 12 000 tecken.
Audit-kedjan visas här när scenariot körs
● Nyhetsbrev
En sammanfattning ungefär en gång i månaden. Vad förändrats i regelverket, vilka pilot-cases vi sett och vilka vendor-shifts som påverkar svenska bolag. Skickas av oss, inte av en automation som låtsas vara oss.