PBL-klass, saknade bilagor, dnr-route till handläggare.
Modul-ID: building-permit-triage Version: 1.0.0 Voice: kapaciti (svensk B2B-ton) Modell: claude-haiku-4-5 Modul: 13 av 16 i kapaciti-modules katalog
Bygglovs-triage tar emot en bygglovsansökan, antingen direkt från kommunens e-tjänst eller via en digitaliserad pappersblankett, och producerar ett strukturerat triage-beslut för bygglovshandläggaren. Modulen klassificerar ärendet enligt Plan- och bygglagen (PBL) 2010:900, identifierar saknade obligatoriska bilagor, föreslår handläggar-routing baserat på distrikt och komplexitet, listar remissbehov, genererar förslag på diarienummer och utformar ett brevutkast till sökanden.
Modulen ersätter inte handläggaren. Den förbereder beslutet så att handläggaren får en granskningsbar startpunkt istället för en blank ansökan. Varje körning producerar en signerad audit-bundle med hash-chain enligt kapaciti-modules-standarden, vilket gör att överprövningsmyndigheter eller internrevisionen kan rekonstruera triage-processen i efterhand.
Cykeltiden från ansökan inkommen till färdig triage är typiskt under 25 sekunder. Resten av handläggningen sker manuellt av kommunens personal med modulens utkast som underlag.
{
application_id: "string",
arrived_at: "ISO timestamp",
application_type: "bygglov" | "rivningslov" | "marklov" | "forhandsbesked" | "anmalan",
property: {
fastighetsbeteckning: "Skelleftea 5:12",
address: "Strandvagen 47, Skelleftea",
kommun: "Skelleftea",
distrikt: "Centrum-Skelleftea",
detaljplan_id: "DP-SKE-2018-014",
detaljplan_status: "gallande" | "saknas" | "pa-grans" | "okand"
},
applicant: {
name: "Erik Andersson",
organization: "privatperson" | "foretag" | "bostadsrattsforening" | "kommun",
org_nr_or_personnr: "string (sista 4 hashade for integritet)"
},
proposed_action: {
summary: "string",
estimated_floor_area_m2: 28,
estimated_height_m: 3.2,
affected_buildings: ["enfamiljshus"],
near_protected_area: false,
affects_facade: true,
is_within_existing_byggnadskropp: false
},
attached_documents: [{ doc_id, type, filename, uploaded_at }],
required_documents_list: ["ansokan", "situationsplan", ...]
}
Validering sker i validateInput. Saknas något obligatoriskt fält kastas ett fel innan modellen anropas, och fallet loggas i audit-chain som ett input_received-block följt av ett error-output.
Plain text med fast struktur. Bygglovssystemet parsar nycklarna och plockar ut värdena. BREV_TILL_SOKANDE_UTKAST är 150-300 ord svensk prosa, redo att skickas efter handläggar-godkännande.
PBL_KLASSIFICERING: bygglov
PBL_HUVUDPARAGRAF: 9 kap 2 §
KOMPLEXITET: medel
SAKNADE_DOKUMENT:
- DOKUMENTTYP: fasadritning
PBL_GRUND: 9 kap 20 §
ATGARD: obligatorisk-innan-bedomning
KRITISKA_FYND:
- <0 till 5 fynd>
GRANNHORANDE_KRAVS: ja
REMISS_KRAVS:
- LANTMATERIET: nej
- TRAFIKVERKET: nej
- LANSSTYRELSEN: nej
- RADDNINGSTJANSTEN: ja
HANDLAGGAR_FORESLAG:
- DISTRIKT: Centrum-Skelleftea
- KOMPETENS_KRAVS: standard-bygglov, brandskydd
- UPPSKATTAD_HANDLAGGNINGSTID_VECKOR: 7
DNR_FORESLAG: BN-2026-892471
NASTA_STEG_FOR_HANDLAGGARE: 1. ... 2. ... 3. ...
BREV_TILL_SOKANDE_UTKAST: <prosa>
INTERNA_NOTERINGAR: <bullets>
PBL_REFERENSER_ANVANDA: <lista>
Modulen citerar Plan- och bygglagen (2010:900) med formatet N kap M §. Tabellen nedan listar de vanligaste paragraferna som triage-agenten refererar till. Varje hänvisning i utdata valideras mot detta format, och en samlad lista av faktiskt använda referenser ligger i sektionen PBL_REFERENSER_ANVANDA.
| Referens | Innehåll | |----------|----------| | 9 kap 2 § | Huvudregel: bygglov krävs för nybyggnad, tillbyggnad och vissa ändringar | | 9 kap 4 § | Bygglovsbefriade åtgärder för en- och tvåbostadshus (Attefall, friggebod, max 15 m² tillbyggnad) | | 9 kap 5 § | Bygglovsbefriade åtgärder för komplementbyggnader | | 9 kap 17 § | Förhandsbesked utanför detaljplanelagt område | | 9 kap 20 § | Ansökans innehåll och obligatoriska handlingar | | 9 kap 21 § | Komplettering av ofullständig ansökan | | 9 kap 25 § | Grannhörande | | 9 kap 30 § | Förutsättningar för bygglov inom detaljplan | | 9 kap 31 § | Förutsättningar för bygglov utanför detaljplan | | 10 kap 5 § | Kontrollansvarig vid byggåtgärd | | 10 kap 6 § | Kontrollplan | | 11 kap | Tillsyn, ingripanden och påföljder | | 12 kap | Avgifter för byggnadsnämndens handläggning | | 8 kap | Tekniska krav på byggnadsverk (tillgänglighet, energi, brand) |
Bygglovsbefriad-test. Klassificering som bygglovsbefriad kräver att alla fyra villkoren är uppfyllda samtidigt: åtgärden ryms inom 9 kap 4-5 § eller inom befintlig byggnadskropp, fasadpåverkan är noll, bruttoarea max 25 m² och fastigheten ligger inte i närheten av ett skyddat område. Faller någon av dessa, klassificeras ärendet som bygglov eller annat.
Detaljplan-styrning. Om detaljplan-status är gallande prövas åtgärden mot 9 kap 30 §. Om status är saknas rekommenderar modulen förhandsbesked enligt 9 kap 17 § och prövning mot 9 kap 31 §. Status pa-grans eskaleras till sarskild-bedomning med kommentar i KRITISKA_FYND. Status okand triggar omedelbar komplettering enligt 9 kap 21 §.
Konservativ klassificering. Vid tvekan mellan bygglov och bygglovsbefriad väljer modulen alltid bygglov. Vid tvekan om komplexitet väljer modulen ett steg uppåt. Auto-godkännande är aldrig möjligt, modulen ger bara handläggar-förslag.
Remissbehov. Lantmäteriet remitteras vid fastighetsgränsfrågor eller ny avstyckning. Trafikverket vid in- eller utfart mot allmän väg eller järnväg. Länsstyrelsen vid riksintresse, strandskydd, kulturmiljö eller fornlämning. Räddningstjänsten vid brandcellpåverkan, samlingslokal, höjd över 8 meter eller närhet till brandfarliga verksamheter.
Förslaget på diarienummer är deterministiskt utifrån ansöknings-id och ankomstdatum, vilket gör att samma ansökan alltid får samma Dnr-förslag oavsett om triage körs flera gånger. Format: BN-<YYYY>-<NNNNNN> där BN är byggnadsnämnden, YYYY är året från arrived_at och NNNNNN är ett sex-siffrigt löpnummer från en hash av application_id. Det slutgiltiga Dnr sätts av handläggaren när ärendet registreras i kommunens ärendehanteringssystem, men förslaget används som spårnings-id i triage-bundlen.
Distriktet matchas mot property.distrikt om angivet, annars sätts kommun-default. Kompetenskrav identifieras från åtgärdens karaktär: kulturmiljo när åtgärden gäller skyddad miljö, brandskydd vid komplex tillbyggnad eller publik verksamhet, miljovardlig-planering vid närheten till skyddat naturområde, tillganglighet vid publika lokaler, geoteknik vid markarbeten eller känslig grund. Standardärenden får etiketten standard-bygglov.
Uppskattad handläggningstid:
| Komplexitet | Veckor | |-------------|--------| | enkel | 4 | | medel | 6 till 8 | | komplex | 10 till 12 | | sarskild-bedomning | 12 till 20 |
Brevet är 150-300 ord, formellt men pedagogiskt. Det öppnar med "Hej <namn>," bekräftar mottagandet, listar saknade bilagor med konkret beskrivning av vad varje handling ska innehålla, anger förväntad handläggningstid efter komplettering och avslutar med kontaktuppgift. Modulen lovar aldrig en snabbare handläggningstid än kommunens normala riktvärde. Inga emojis, inga tankstreck.
Varje körning bygger en audit-trail med blocken:
input_receivedcontext_loadedagent_calloutput_generatedvoice_validatedoutput_validatedaudit_sealedBundlen signeras med kapaciti-modules Ed25519-nyckel och verifieras med lib/audit-chain.mjs::verifyBundle eller kapaciti-site/scripts/verify-audit-bundle.mjs. Hash-kedjan är genesis-baserad, så att ett enskilt manipulerat block bryter verifieringen från och med det blocket. Detta är centralt för offentlig sektor: triage-beslut kan granskas av JO, länsstyrelsen eller mark- och miljödomstolen utan att kommunen behöver lita på interna loggar.
Output passerar validateAgainstVoice("kapaciti"). Förbjudna ord: ensure, crucial, journey, delve, dive, navigate, sammanfattningsvis, TL;DR. Förbjudna tecken: tankstreck. Modellen instrueras att använda komma eller punkt istället.
import { BuildingPermitTriage } from "kapaciti-modules/modules/building-permit-triage.mjs";
const triage = new BuildingPermitTriage();
const res = await triage.run(ansokanInput, { writeBundle: "./bundles/bl-0044.json" });
if (res.error === "usage_cap") {
// Claude Code usage-cap, retry senare via kommunens kö
}
console.log(res.output);
console.log("Audit-bundle:", res.bundle.run_id, "blocks:", res.bundle.entries.length);
Modulen läser inte själva bilagornas innehåll, bara typen som angetts i attached_documents. Saknas en handling som finns med i listan men har felaktig typ-etikett, klassificeras den ändå som saknad. Vision-baserad granskning av ritningar ligger utanför scope och hanteras i en kommande vision-modul.
Modulen tar inte beslut om strandskyddsdispens eller övriga dispenser. Dessa ligger hos länsstyrelsen och remitteras dit via REMISS_KRAVS.LANSSTYRELSEN.
Modulen läser inte detaljplanens fullständiga bestämmelser, bara den status-etikett som kommunen tilldelat. Avvikelse-prövning enligt 9 kap 30 § andra stycket hanteras av handläggaren med modulens KRITISKA_FYND som startpunkt.
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.