Drivs fram genom en innovationssprint kring dokumenthantering
Arbetsmetoden som beskrivs här utvecklas i skarpt läge genom en pågående innovationssprint inom området dokumenthantering. Sprintens primära fokus är att testa nya tvärfunktionella arbetsmetoder i den tekniska utvecklingen samt att använda AI som aktivt verktyg genom hela processen.
Över tid kommer arbetssättet att omfamna fler områden — exempelvis UX, verksamhetsnära design och bredare samarbetsformer. I inledningen är fokus dock medvetet avgränsat till den tekniska delen av utvecklingen, för att skapa fullt fokus och bästa möjliga förutsättningar att verkligen utmana etablerade mönster där.
Varför behövs ett nytt arbetssätt?
Sundsvalls kommun har historiskt arbetat med traditionell agil utveckling inspirerad av stora ramverk som SAFe, utan att ha valt ett specifikt ramverk. Utvecklingsteamen har delats upp utefter kompetensområde — backend och frontend — med flera lager av roller mellan verksamheten och utvecklarna: projektledare, verksamhetsutvecklare, lösningsarkitekter och teamledare.
Verksamheten, som är ovan vid teknisk utveckling, har ofta svårt att formulera krav tidigt i processen. Kravbilden förändras löpande, vilket skapar osynk som leder till förseningar, budgetöverskridanden och resultat som inte möter verksamhetens faktiska behov.
- Projekt drar ut på tiden och håller inte budget
- Uppdelning i backend- och frontend-team skapar beroenden och väntetider
- Flera lager mellan verksamhet och utvecklare försvårar kommunikation
- Verksamheten har svårt att uttrycka krav tidigt — kravbilden ändras löpande
- Resultaten uppfyller inte verksamhetens faktiska behov
- Tvärfunktionella team som kan lösa hela uppgiften
- Direktkontakt mellan verksamhet och utvecklare — inga mellanlager
- Snabbare leveranscykler och kortare feedbackloopar
- Prototypdriven utveckling som validerar hypoteser tidigt
- AI som verktyg för att accelerera utvecklingsprocessen
Innovationssprintens faser
Sprinten är uppbyggd i tre faser: en förberedande fas innan sprinten startar, själva genomförandefasen på två veckor, och en avslutande fas med utvärdering och kunskapsöverföring.
Förberedelser innan sprinten
Förberedelsefasen syftar till att skapa rätt förutsättningar så att teamet kan vara produktivt från dag ett. Fyra centrala delar genomförs:
Prototyp i samarbete med verksamheten
En fungerande webbapplikation tas fram genom vibekodning — systematiskt och kontrollerat — och deployas i en containerbaserad miljö. Verksamheten testar prototypen och ger tidig input på funktion och flöden. Detta validerar hypotesen och bekräftar att det finns ett värde i att gå vidare med sprinten.
Arkitektur- och teknikdialog
Veckan innan sprinten genomförs en övergripande dialog kring lösningsarkitektur och tekniska förutsättningar utifrån prototypen. Teamet alignar kring teknikstack, miljöer och övergripande designbeslut så att alla är redo att börja direkt.
Egen deploykedja till testbädd
Teamet säkerställs full access att själva deploya ändringar direkt till en dedikerad testbädd (sundsvall.dev). Inga beroenden till andra team, som exempelvis IT-produktion, för att löpande kunna leverera och verifiera förändringar under sprintens gång. Autonomi i hela kedjan är en förutsättning för sprintens tempo.
Bedöm verksamhetens involvering
Graden av verksamhetsinvolvering under sprinten måste bedömas utifrån vad som ska byggas. Handlar sprinten om en verksamhetsspecifik funktion som kräver särskild domänkunskap är det oerhört viktigt med nära, dagligt samarbete med verksamhetsspecialister. Handlar det istället om en funktion med strategisk och taktisk bredd — mer tekniskt driven — kan verksamheten vara mindre involverad i det dagliga arbetet. Det finns inget standardsvar; varje sprint kräver en medveten bedömning av hur och hur ofta verksamheten ska delta.
Standup — sprintens dagliga nav
Varje dag genomförs en standup som fungerar som teamets gemensamma synkpunkt. Standupens syfte är tvådelat: att röja hinder för utvecklingen och att synka frågor och funderingar inom teamet och med verksamheten.
Genomgång av gårdagens utveckling
Teamet går igenom vad som gjorts sedan förra standupet — vad är klart, vad pågår, och var står vi i förhållande till sprintens mål?
Demo av ny funktionalitet
Om ny funktion har levererats körs en kort demo så att hela teamet ser framstegen och kan ge direkt feedback.
Frågor, hinder & synk
Öppen dialog där teammedlemmar lyfter blockeringar, frågor till verksamheten eller tekniska funderingar som behöver lösas för att arbetet ska flyta vidare.
Bärande principer för sprinten
Dessa principer vägleder teamets arbete genom hela sprinten.
Noll avstånd
Alla mellanlager mellan verksamhet och utveckling elimineras. Direkt dialog, direkt feedback.
Snabba leveranser
Korta cykler, dagliga leveranser och snabba feedbackloopar som fångar förändrade behov.
Tvärfunktionellt
Ett team som täcker alla kompetenser. Inga beroenden till andra team, ingen väntan.
AI-accelererat
AI används som verktyg i utvecklingen för att öka tempo och frigöra utvecklarnas kreativa kraft.
Hypotesdriven
Prototypen validerar en hypotes innan resurser investeras. Vi testar innan vi bygger klart.
Löpande anpassning
Processen utvecklas under sprinten. Vi lär oss och justerar dagligen.
Vad innebär det att delta i en innovationssprint?
Att delta i en innovationssprint är inte som vanligt projektarbete. Tempot är högre, avstånden kortare och förväntningarna annorlunda. Den här guiden beskriver det mindset och de beteenden som krävs av varje deltagare — oavsett roll — för att sprinten ska lyckas.
Mycket av det som beskrivs här kan kännas självklart. Men erfarenheten visar att det är just i gapet mellan att veta vad som krävs och att faktiskt agera därefter som de flesta sprintar fallerar. Läs med öppet sinne — inte för att lära dig nya saker, utan för att kalibrera ditt förhållningssätt.
En sprint lyckas inte för att teamet har rätt kompetens — den lyckas för att teamet har rätt inställning.
Ta ägarskap — inte instruktioner
Du är inte här för att utföra uppgifter. Du är här för att lösa ett problem.
I en sprint finns det ingen produktägare som talar om exakt vad du ska bygga. Det finns inget kravdokument som beskriver varje detalj. Istället finns det ett problem som behöver lösas, och du är en del av det team som ska lösa det.
Det innebär att du behöver förstå varför vi bygger det vi bygger — inte bara vad. Om du ser att något inte stämmer, att en lösning inte fungerar, eller att vi är på väg åt fel håll — då är det ditt ansvar att säga ifrån. Inte någon annans.
- Du ställer frågor när något är oklart — direkt, inte efter mötet
- Du föreslår alternativ om du ser en bättre väg
- Du tar initiativ att lösa problem utan att vänta på instruktioner
- Du hjälper teammedlemmar som fastnat, även om det inte är ditt ansvarsområde
- Väntar på att bli tilldelad arbete istället för att ta det
- Ser problem men säger inget — "det är inte mitt bord"
- Följer instruktioner blint trots att resultatet uppenbart blir fel
- Skjuter frågor framför sig — "jag tar det imorgon"
Kommunicera direkt och ofta
Kort avstånd kräver frekvent dialog. Tystnad är det största hindret.
En av sprintens viktigaste egenskaper är att avstånden mellan alla deltagare är minimala. Det finns inga mellanlager som filtrerar eller fördröjer information. Det betyder att du har direkt tillgång till alla — verksamheten, utvecklarna, alla i teamet.
Men kort avstånd är bara värdefullt om det faktiskt används. Om du sitter tyst med en fråga, om du inte delar framsteg eller om du undviker att ge direkt feedback — då förlorar vi sprintens viktigaste fördel.
Feedback ska ges direkt — inte sparas till nästa möte
I en sprint med dagliga leveranser hinner saker bli fel snabbt om feedback inte kommer i tid. Om du ser något som inte stämmer — i en demo, i en lösning, i ett beslut — säg det direkt. Att vara rak är inte oartigt. Att vänta tills det är för sent att ändra — det är problemet.
Det gäller alla riktningar: utvecklare mot verksamhet, verksamhet mot utvecklare, och kollegor sinsemellan. Sprinten lever på ärlig, omedelbar kommunikation.
Håll tempot — varje dag räknas
Tio arbetsdagar är inte mycket. Det som inte händer idag, händer kanske aldrig.
En tvåveckorssprint har ingen buffert. Det finns ingen "nästa sprint" att skjuta saker till. Det som inte görs idag minskar direkt vad vi kan åstadkomma totalt. Det betyder inte att du ska stressa — det betyder att du ska vara fokuserad och medveten om att din tid har direkt påverkan på resultatet.
Praktiskt innebär det: kom förberedd till standup. Lyft hinder direkt istället för att försöka lösa dem ensam i timmar. Fatta snabba beslut med tillräckligt bra information istället för att vänta på perfekt information som aldrig kommer.
Det perfekta är det godas fiende. Vi bygger för att lära — inte för att leverera en slutprodukt.
Omfamna förändring — det är meningen
Det vi bygger idag kommer att ändras imorgon. Och det är precis rätt.
I traditionellt projektarbete ses ändringar som ett problem — ett tecken på dålig planering eller otydliga krav. I en sprint är ändringar ett bevis på att processen fungerar. Vi bygger, vi testar, vi lär oss, och vi justerar. Det är själva poängen.
Det kräver att du släpper tanken på att "din del" ska vara perfekt och färdig. Var beredd på att det du byggt kan kastas om, att prioriteringar ändras och att lösningen utvecklas i en riktning du inte förutsåg. Det handlar inte om att ditt arbete var dåligt — det handlar om att vi vet mer nu än vi visste igår.
- "Vi lärde oss att det inte fungerade — bra, nu vet vi mer"
- "Verksamheten vill ha det annorlunda — då bygger vi om"
- "Jag hade fel om det här — tack för feedbacken"
- "Men vi bestämde ju redan att det skulle vara så här"
- "Det kan vi inte ändra nu — jag har redan byggt klart det"
- "Det borde verksamheten ha sagt från början"
Teamet framför individen
Din viktigaste uppgift är inte att vara bra på ditt — det är att göra teamet bättre.
I en innovationssprint arbetar alla tätt tillsammans. Det innebär att om du är klar med din uppgift men en kollega sitter fast, så är din nästa uppgift att hjälpa den kollegan. Det spelar ingen roll att det inte är "ditt område". Sprintens framgång mäts i vad teamet levererar — inte vad du personligen åstadkom.
Det innebär också att du behöver vara transparent med var du står. Att erkänna att du fastnat är inte en svaghet — det är att ge teamet möjlighet att lösa problemet snabbare. Att dölja problem för att "lösa det själv" är den dyraste misstaget i en sprint.
Alla roller är jämlika under sprinten
Under sprinten finns inga hierarkier. En verksamhetsspecialists observation väger lika tungt som en senior utvecklares tekniska bedömning. Den som har rätt information i stunden har mest att bidra med — oavsett titel. Det förhållningssättet kräver att alla lyssnar aktivt och respekterar varandras perspektiv.
Ha mod att vara obekväm
Tillväxt sker utanför komfortzonen — det gäller både produkten och dig.
En sprint pressar gränser. Du kommer att arbeta med människor du inte brukar samarbeta med. Du kommer att fatta beslut med ofullständig information. Du kommer att visa halvfärdigt arbete. Du kommer att få feedback som utmanar dina antaganden.
Allt detta är obekvämt. Men det är i det obehagliga som de verkliga genombrotten sker — både för produkten och för dig som deltagare. De sprint som producerar bäst resultat är de där deltagarna vågade vara osäkra, ställa dumma frågor och prova saker som kanske inte fungerade.
Den som aldrig visar halvfärdigt arbete lär sig aldrig om det var rätt väg. Våga visa, våga fråga, våga ändra dig.
Sex principer — ett mindset
Allt kokar ner till en enda sak: du är här för att bidra till att teamet löser ett verkligt problem på kortast möjliga tid. Det kräver ägarskap, rakhet, tempo, flexibilitet, laganda och mod.
Ägarskap
Förstå varför, inte bara vad. Ta ansvar för helheten.
Kommunikation
Prata direkt, ge feedback omedelbart, dölj ingenting.
Tempo
Varje dag räknas. Agera nu med tillräckligt bra information.
Förändring
Ändringar är bevis på framsteg. Omfamna dem.
Laganda
Teamets resultat är ditt resultat. Hjälp andra först.
Mod
Visa halvfärdigt. Ställ frågor. Våga ha fel.
Dokumenthanteringsapplikationens funktioner
Nedan listas samtliga planerade funktioner grupperade per funktionsområde. Varje funktion har ett unikt ID med prefix för sitt område. Bocken visar om funktionen implementerats under sprinten.
-
SÖK-01
FritextsökningSök i titel, beskrivning och taggar med svensk språkhantering (stemming). Resultat rankas efter relevans.
-
SÖK-02
Bläddra per organisationNavigera i organisationsträdet och se dokument per enhet. Antal visas rekursivt inklusive underorganisationer.
-
SÖK-03
Bläddra per dokumenttypUtforska dokument grupperade efter typ — policy, riktlinje, rutin, handlingsplan med mera.
-
SÖK-04
Bläddra per kategoriFiltrera dokument via den hierarkiska kategoristrukturen som komplement till organisation och typ.
-
SÖK-05
AI-chattStäll frågor på vanlig svenska. AI-assistenten söker i systemet och presenterar relevanta dokument med permanenta länkar.
-
SÖK-06
Mina dokumentPersonlig vy som visar dokument där du har en roll — som ägare, författare, granskare eller godkännare.
-
SÖK-07
Utökad sökning på all fildataInförande av t ex Elasticsearch för att möjliggöra sökning i all data i alla filer, inte enbart sökning på metadata, filnamn osv.
-
DOK-01
Metadata-kortVarje dokument har ett kort med titel, beskrivning, status, typ, organisation, ägare, giltighet, beslutsinformation och taggar.
-
DOK-02
VersionshanteringLadda upp nya versioner som numreras sekventiellt (v1, v2, v3). Senaste markeras som aktuell. Alla versioner bevaras.
-
DOK-03
ÄndringsanteckningarVarje version kan ha en anteckning som beskriver vad som ändrats.
-
DOK-04
Permanenta länkarVarje dokument får en unik URL som aldrig ändras. Pekar alltid på senaste versionen om inte specifik version anges.
-
DOK-05
Filnedladdning/d/{slug} — laddar ner senaste filen direkt.
-
DOK-06
Metadata-vy/d/{slug}/info — visar dokumentkortet i webbläsaren.
-
DOK-07
Specifik version/d/{slug}/v/{nr} — laddar ner en specifik version.
-
DOK-08
StyrkedjaKoppla dokument hierarkiskt: policy → riktlinje → rutin. Cirkulära kedjor blockeras. Inversen beräknas automatiskt.
-
DOK-09
MedverkandeKoppla personer med roller: författare, granskare, godkännare. Utöver den ensamma ägaren.
-
LIV-01
DokumentstatusLivscykel med fyra steg: utkast → aktiv → utgången/upphävd. Bara aktiva dokument visas för vanliga användare.
-
LIV-02
ÅtgärdspunkterAutomatiskt genererade uppgifter: utgående dokument, föräldralösa dokument (utan ägare), försenad granskning.
-
LIV-03
AllvarlighetsgradVarje åtgärd klassas som låg, medel, hög eller kritisk. Filtrering i förvaltningsvyn.
-
LIV-04
GranskningsflödeStarta granskning med utvalda granskare och godkännare. Varje person lämnar beslut (godkänt/ändringar krävs).
-
LIV-05
LäskvittensBegär att specifika personer kvitterar att de läst ett dokument. Spåra vilka som kvitterat och påminn övriga.
-
LIV-06
PrenumerationerPrenumerera på dokument och få notifieringar vid ny version, statusändring eller granskningsförfrågan.
-
LIV-07
NotifieringarCentral notifieringsvy med alla händelser. Markera som lästa eller navigera direkt till berört dokument.
-
LIV-08
GiltighetskontrollBevakning av giltighets- och granskningsdatum. Åtgärdspunkter skapas 30, 14 och 7 dagar före utgång.
-
AI-01
AI-chattKonversationsbaserad dokumentsökning med fem verktyg: fritextsökning, hämta dokument, lista per typ, lista per organisation, utgående dokument.
-
AI-02
KlarspråksversionAI-genererad förenklad version av dokumentet enligt Språkrådets riktlinjer. Sparas per dokumentversion med historik.
-
AI-03
PromptversionshanteringVarje generering sparar vilken modell och promptversion som användes för spårbarhet.
-
AI-04
TillgänglighetsanalysPoängsättning 0–100 med färgkodad badge (grön/gul/röd). Analyserar fyra kategorier med specifika förbättringsförslag.
-
AI-05
Språk och läsbarhetMeningslängd, ordval, passiva konstruktioner, LIX-nivå.
-
AI-06
Struktur och navigationRubriker, styckeindelning, logisk ordning.
-
AI-07
KlarspråkFacktermer utan förklaring, juridiskt språk, abstrakta formuleringar.
-
AI-08
TillgänglighetsanpassningTydliga hänvisningar, konsekvens, målgruppsanpassning.
-
AI-09
TextextraktionAutomatisk textextraktion från PDF och DOCX som underlag för AI-analys. Max 100 000 tecken.
-
STA-01
NedladdningsstatistikVarje filnedladdning loggas oavsett källa (webbapp, API, widget, permanent länk). Visas per dokument.
-
STA-02
Daglig grafStapeldiagram över nedladdningar per dag de senaste 30 dagarna.
-
STA-03
Per versionNedladdningsantal uppdelat per dokumentversion.
-
STA-04
Topp 10-listaÖversiktssidan visar de tio mest nedladdade dokumenten i hela systemet.
-
STA-05
TillgänglighetsöversiktDashboard-kort som visar antal dokument med bristande tillgänglighet eller som saknar analys.
-
STA-06
ÖversiktspanelDashboard med samlade nyckeltal: aktiva dokument, utkast, utgångna, öppna uppgifter.
-
ARK-01
SIP-paketgenereringSkapa Submission Information Packages enligt E-ARK CSIP/SIP-standarden med korrekt mappstruktur.
-
ARK-02
METS-metadataGenererar METS.xml med E-ARK-profil, korrekta namespaces och filreferenser.
-
ARK-03
EAD-beskrivningBeskrivande metadata mappat från dokumentkortet till EAD-format.
-
ARK-04
SHA-256-checksummorChecksumma beräknas för varje fil i paketet samt för hela ZIP-filen.
-
ARK-05
PaketvalideringValidera genererat METS.xml mot XSD-schema. Kontrollera att alla filer och checksummor stämmer.
-
ARK-06
LeveransmottagareKonfigurera mottagare (t.ex. kommunarkiv, Sydarkivera) med leveransöverenskommelse och leveransmetod.
-
ARK-07
ExporthistorikSpåra alla exportförsök per dokument med status, tidpunkt och valideringsresultat.
-
INT-01
Publikt APIAktiva dokument nåbara utan inloggning via REST-API. Metadata och filnedladdning.
-
INT-02
OpenAPI-specifikationKomplett API-dokumentation i OpenAPI 3.1-format med interaktiv Swagger UI.
-
INT-03
Inbäddningsbar widgetBädda in dokumentkort på externa webbplatser via iframe eller JavaScript-widget med Shadow DOM.
-
INT-04
Dokumentkort-embedEnskilt dokument som iframe eller script-tagg med titel, typ, giltighet och nedladdningsknapp.
-
INT-05
Typlistnings-embedLista alla dokument av en viss typ som inbäddningsbar vy på extern webbplats.
-
INT-06
MCP ServerModel Context Protocol-server som exponerar fem verktyg för AI-tjänster att söka och läsa dokument.
-
INT-07
HemtjänstappMobilanpassad vy för fältpersonal med AI-chatt och dokumentbläddring — utan att navigera hela systemet.
-
ADM-01
OrganisationshanteringHierarkiskt träd som speglar kommunens struktur. Skapa, redigera och inaktivera enheter.
-
ADM-02
DokumenttyperAdministrera typer (policy, riktlinje, rutin m.m.) med namn, beskrivning och sorteringsordning.
-
ADM-03
KategorierHierarkisk kategoristruktur för navigering. Mjuk gruppering — dokument kan finnas utan kategori.
-
ADM-04
PersonhanteringHantera tjänstepersoner som kopplas till dokument som ägare och medverkande.
-
ADM-05
AnvändarhanteringHantera konton med fyra roller: läsare, författare, förvaltare, admin. Roller styr åtkomst till funktioner.
-
ADM-06
ArkivmottagareKonfigurera mottagare för e-arkivleveranser med leveransöverenskommelse och leveransmetod.
-
ADM-07
OmorganisationsdemoSimulera konsekvenser av organisationsförändringar: berörda dokument, personer, styrkedjor och ägarskapsflyttning.
Lärdomar som förändrar hur vi arbetar
Innovationssprinten handlar inte enbart om att leverera ett dokumenthanteringssystem — den utmanar också våra befintliga arbetssätt och tekniska val. När vi arbetar i högt tempo med AI som medarbetare framträder mönster och friktionspunkter som vi annars kanske aldrig hade synliggjort. Här samlar vi de insikter som behöver tas vidare i vår generella utveckling, bortom just detta projekt.
Vårt nuvarande designsystem och frontend-ramverk är i grunden ett internt bygge — vi har lagt tid och energi på att skapa komponenter, stilsättning och mönster helt från grunden. Det har gett oss kontroll, men kontroll till ett högt pris. Varje ny komponent kräver egenutveckling, vilket konkurrerar med tid som borde gå till affärslogik och användarnytta. Systemet är per definition begränsat till precis det vi hunnit bygga — ingenting mer.
Tillgänglighet är ett särskilt sårbart område. Att garantera att formulär, modaler, dropdowns och navigationsstrukturer uppfyller WCAG-kraven kräver djup specialistkunskap och löpande testning. När vi äger varje rad kod är vi också den enda som ansvarar för att rätta fel, följa upp nya krav och granska ändringar. Det är en börda som är svår att bära i ett litet team.
I omvärlden har ekosystemet rört sig snabbt. Ramverk som shadcn/ui — byggt ovanpå Radix UI och Tailwind CSS — erbjuder idag hundratals färdiga, tillgänglighetsgranskade komponenter som underhålls av ett aktivt globalt community. De är välkända, välstrukturerade och väldelade, vilket gör dem till ett naturligt förstahandsval för AI-verktyg som Copilot och Claude. Det innebär att en AI kan generera korrekt, produktionsklar komponentkod direkt — utan att behöva lära sig ett proprietärt internt ramverk eller anpassa generiska svar till lokala konventioner. Gnidan mellan AI-förslag och verklig kodbas minskar dramatiskt.
Den här sprinten har gjort friktionen tydlig: varje gång vi velat lyfta in ett nytt UI-mönster har vi stött på gränsen för vad vårt nuvarande system klarar av. Det är ett tecken på att det är dags att ta en strategisk diskussion om hur vi vill bygga frontend framöver.
Initiera en utvärdering av om vi ska migrera till eller komplettera med ett etablerat komponentbibliotek som shadcn/ui. Utvärderingen bör väga in tillgänglighetskrav, AI-verktygens förmåga att generera kod för ramverket, underhållsbörda och migreringsarbete för befintliga applikationer.
Vår nuvarande strategi lutar tungt mot en ren mikrotjänstarkitektur — varje avgränsad funktion lever i en egen tjänst, kommunikation sker via API:er och varje tjänst kan i teorin bytas ut oberoende. Det är ett elegant mönster på papper, men i praktiken introducerar det komplexitet som är svår att hantera när applikationslogiken är rik och sammanhängande.
Dokumenthantering är ett tydligt exempel. När logik kring livscykel, revisioner, ansvar, metadata, publicering och giltighetsfönster är utspridd över flera tjänster uppstår ofrånkomligen koordineringsproblem: transaktioner som spänner över tjänstgränser, svårigheter att upprätthålla konsistens, och en hög kognitiv kostnad för den som ska förstå systemet som helhet. Varje ny funktion kräver att man navigerar flera kodbasers konventioner, deploymentpipelines och API-kontrakt.
Det finns också en distributionsutmaning. En applikation som är sammansatt av ett dussin mikrotjänster är svår att paketera, dokumentera och lämna över till en annan part — en annan kommun, en driftspartner eller ett förvaltningsteam. Det som är modulärt i teorin kan bli en labyrint i praktiken.
Lösningen är inte att överge mikrotjänster helt — utan att vara tydligare med var gränsen går. Applikationsdomänspecifik logik hör hemma i en sammanhållen applikationstjänst som äger sin domän fullt ut. Generell funktionalitet som behövs i alla applikationer — att skicka meddelanden via Messaging-API, slå upp organisation och användare i Metakatalogen, hantera filer i gemensam objektlagring — fortsätter att leva i delade, generella mikrotjänster. Det ger oss det bästa av två världar: sammanhållen applikationslogik med tydlig ägare, och återanvändbar infrastruktur för det gemensamma.
Etablera ett arkitekturmönster som skiljer på applikationstjänster (domänrik, applikationsspecifik logik i en sammanhållen tjänst) och plattformstjänster (generella, delade mikrotjänster). Tillämpa mönstret som standard vid nya applikationsprojekt och utvärdera om befintliga applikationer bör konsolideras.
Dokumenthantering — dag för dag
Detta är den pågående innovationssprinten kring Dokumenthantering — sprinten som ligger till grund för uppbyggnaden av arbetssättet som beskrivs i de andra flikarna. Här dokumenteras processen dag för dag: anteckningar från standup, möten, beslut och den faktiska utveckling som skett i koden.
Så uppdateras sidan: Efter varje standup lämnar Jari anteckningar som kompletteras med commit-historik från sprintens två kodrepon. Sidan växer löpande under sprintens gång och blir därmed både en levande dokumentation och en framtida referens.
Sprintens logg
Anteckningar från standup
Dagen inleddes med ett uppstartsmöte där hela teamet samlades för en genomgång av hypotesen och målbilden — vad är det vi ska åstadkomma? En live-demo av prototypen genomfördes så att alla fick se och förstå den lösning som verksamheten redan gett input på.
Möten & diskussioner
Efter demon öppnades ett längre dialogpass där teamet ställde frågor och förtydligade lösningens olika delar. Syftet var att bygga gemensam förståelse — inte bara kring vad som ska byggas, utan varför. Därefter bröts första dagens utveckling ned i konkreta, startbara aktiviteter.
Beslut & insikter
1. Uppstartsmöte med genomgång av hypotes och målbild.
2. Demo och genomgång av befintlig prototyp.
3. Öppen dialog — frågor och förtydliganden kring lösningen.
4. Nedbrytning av arbete i konkreta, startbara aktiviteter.
Kodutveckling denna dag
Teamet kom igång i högt tempo direkt — över 60 commits landade i web-app-document medan api-service-document fick en mindre konfigurationsändring. Arbetet kretsade kring fem huvudspår: autentisering och rollhantering, grundläggande frontend-plattform (shadcn-migration, error boundaries, toast-feedback), containernätverk mot Dokploy, proxy-/multipart-korrigeringar mellan frontend och backend, samt ett första utkast till marketplace-plugin med en api-service-document skill.
- b57e543fix: update default tenant logo to Sundsvalls kommun
- c1e32a9fix: add missing NEXT_PUBLIC_AUTH_TYPE build arg to Dockerfile
- 64129eafix: add middleware auth guard for token mode
- ef6fb74chore: add pre-commit pipeline with ESLint, Prettier, and commitlint
- de9fbf8Merge: shadcn-migration
- 08c7a5afix: add backend to default network for container communication
- 2053a29fix: restore missing class-transformer and class-validator deps
- 6e2311cfeat: add api-service-document skill to marketplace plugin
- 5044edffix: put backend on dokploy-network for container communication
- 9628e10fix: route saml auth through runtime proxy
- 1e5bf54feat: auto-configure plugin at project scope for zero-setup DX
- 9b0a8cffeat: add user avatar dropdown menu
- 19b9890docs: update README with mermaid architecture diagram and current tech stack
- 76bc725feat: add AUTH_MODE strategy for API authentication
- e3c3832fix: improve SAML logging, add GET callback binding, and Docker healthcheck support
- ce60578feat: make API path prefix configurable via env var
- 51d197dfeat: add toast feedback, form validation, and error boundaries
- 32ecdd8fix: resolve relative Location header after upstream POST
- 3b3a0d2fix: preserve multipart boundary in proxy and remove Location follow-up
- 8bcece2fix: handle document Blob as file field in multer parsing
- 949a775fix: auto-set createdBy from logged-in user instead of manual input
- b9a5ee3feat: add mock user picker for token login flow
- a737b88add database properties as env vars
Taggar
uppstart demo nedbrytning auth frontend-foundation infra multipart-proxy
Nästa dag
Fortsatt arbete utifrån den nedbrytning som gjordes under dagen — teamet tar första bitarna vidare från prototyp mot en första körbar iteration.
Anteckningar från standup
Grundapplikationen är uppe på documents.sundsvall.dev — åtkomstkod krävs. Appen kan redan hantera alla befintliga funktioner i documents-mikrotjänsten: ladda upp filer, ta bort filer m.m. Frontend-fokus ligger nu på vyer för att lista dokument utifrån organisation och typ. Organisationsträdet hämtas från Metakatalogen i light-varianten som döljer tomma nivåer.
Möten & diskussioner
Teamet har använt Claude för att göra en riskanalys av befintlig documents-mikrotjänst inför en bredare uppskalning till allmän dokumenthantering. Analysen lyfter både risker och konkreta tips — bland annat att använda WOPI-protokollet som stöds av i stort sett alla dokumentredigeringsverktyg. Under dagen går teamet igenom analysens punkter och bedömer vad som behöver tas med till utvecklingen och eventuellt förändras i den tekniska lösningen.
Länk till analysen: claude.ai/share/6444b031-cc30-4a6f-a68d-7b21204e0114
Beslut & insikter
1. Organisationsvyn baseras på Metakatalogens träd (light-variant, döljer tomma nivåer).
2. Sekretesshantering (confidentiality) plockas bort ur applikationen — förenklar modellen i detta skede.
3. WOPI-protokollet identifierat som en stark kandidat för dokumentredigeringsintegration framåt.
4. Riskanalysen från Claude används som underlag för fortsatta tekniska val i sprinten.
Kodutveckling denna dag
Tempot fortsatt högt — ~48 commits i web-app-document och 3 i api-service-document. Dagen dominerades av fem teman: (1) organisationsträd-vy med Company-API via WSO2 och progressiv laddning, (2) dokumentfilter på typ/avdelning inklusive filtrerat org-träd som bara visar avdelningar med dokument, (3) borttagning av all confidentiality-hantering, (4) revisionshantering för dokument (visa, navigera, märka första/senaste), och (5) OpenAPI-schema med Swagger UI samt flera proxy-/deploy-korrigeringar (healthcheck, 0.0.0.0-bind, retry-logik).
- 2266469feat: add Company API proxy via WSO2 gateway
- 3917f9afeat: add organization tree view with department-document linking
- bfad0f6perf: add sessionStorage cache and progressive loading for org tree
- 2ce1f66perf: add in-memory cache for company API endpoints
- 90724bbfix: match actual API field names and add combined orgtrees endpoint
- 10bc435fix: add backend healthcheck to prevent 502 during deploys
- a53c327feat: add search highlight to department picker dialog
- 7b1bbcdfix: truncate deep tree nodes with hover tooltip and remove double X in search
- 4dea9a9fix: add retry logic to proxy and reduce healthcheck frequency
- 35bb63afeat: add My Documents page with createdBy filter
- 3552c90refactor: strip all confidentiality handling from the application
- 8572150feat: add OpenAPI schema generation and Swagger UI
- 02cfff3fix: bind frontend to 0.0.0.0 so Traefik can reach it
- a157389feat: filter org tree to only show departments with documents
- 748c3dastyle: highlight departments with documents in filtered org tree
- 36ce1a0feat: add DTOs with class-validator for OpenAPI schema generation
- b052383fix: tighten document OpenAPI contract generation
- d2694c0feat: view and navigate specific document revisions
- 3fe99b2fix: accept revision 0 as a valid revision
- 030c948feat: label first and latest revisions in detail page and revisions tab
- 88bf0fdfix: hide revision banner when selected revision is the latest
- ef4071efeat: filter documents by type and department
- bd01913fix: sort revisions table by revision number descending
- c9ce704fix: send 1-based page to /documents/filter
- 855a922Add createdBy filter parameter to structured document search
- 6ffd4f7fix: upgrade version 3.1
- 9f92674Update openapi test
Taggar
live-deploy metakatalogen org-träd filter revisions openapi riskanalys wopi confidentiality-removed
Nästa dag
Fortsatt arbete utifrån riskanalysens punkter — bedöma vilka förändringar som ska in i den tekniska lösningen, och fortsätta utveckla vyerna kring organisation och typ.
Anteckningar från standup
Dagens största förändring: filhanteringen är flyttad ut ur databasen och hanteras nu via S3-API och fillagring. Utöver det har fler användarnära funktioner landat — Mina dokument, revisioner, publiceringslogik (dokument går att ladda ned), en publik vy där dokument kan ses direkt, samt filtrering per organisation.
Möten & diskussioner
S3-övergången — fördelar och utmaningar. Fördelen är att filer nu hanteras som filer ska hanteras: bättre driftförutsättningar, hanterbara snapshots (databasen svällde tidigare eftersom binärinnehåll låg där) och deduplicering som faktiskt fungerar. Utmaningen är långsiktig: hur säkerställer vi att kopplingen mellan databasens metadata och filerna i S3 hålls över tid så att referenser inte bryts?
Metakatalogens organisationsträd — semantic drift. En utmaning lyftes kring den långsiktiga relationen till Metakatalogens organisationsträd. Detta är ett vanligt problem i infrastruktur som bygger på en mikrotjänstarkitektur: samma logiska datapunkt (t.ex. en organisationsenhet) får olika namn, format eller betydelse i olika tjänster eftersom varje tjänst äger sin egen datamodell. Fenomenet brukar kallas semantic drift eller schema divergence och uppstår naturligt i den typen av arkitektur — det är alltså inte unikt för oss utan en välkänd bieffekt av mikrotjänsternas autonomi.
En monolit med gemensamt schema löser delar av namngivningsproblemet men offrar mikrotjänsternas autonomi, skalbarhet och oberoende deploy. Teamet diskuterade istället lösningar som ligger ovanpå arkitekturen: en kanonisk datamodell / shared schema registry, ett BFF-/gateway-lager som normaliserar fältnamn mot frontend, event-kontrakt (Avro/Protobuf/JSON Schema med schema-register), samt governance i form av en gemensam data dictionary. Det som ofta saknas är alltså ett datastyrningslager — inte en ny arkitektur.
AI-stödd utveckling som parallellspår. Cagri lyfte att vi bör starta upp en parallell aktivitet kring rutiner för automatisering med AI-stöd i utvecklings- och kodflödet. Cagri påbörjar det arbetet.
Beslut & insikter
1. Filhantering flyttas från databas till S3 — binärdata ut ur DB, metadata kvar.
2. Långsiktig DB↔fil-koppling identifierad som nyckelrisk att bevaka.
3. Publiceringsflöde på plats: dokument kan nu laddas ned och visas via publik vy.
4. Organisationsfiltrering införd i dokumentvyn.
5. Semantic drift mot Metakatalogen hanteras via datastyrning (kanonisk modell + mappning), inte arkitekturbyte.
6. Parallellt spår startas för AI-automatisering i utvecklingsflödet (Cagri).
Kodutveckling denna dag
Dagens leveranser domineras av två spår: (1) lagringsabstraktionen i api-service-document — en ny BinaryStore med S3- och JDBC-implementationer, S3-user-metadata (originalfilnamn, municipality-id), RFC 5987-hantering av icke-ASCII-filnamn och flera Garage-kompatibilitetsfixar för aws-sdk, samt (2) validitetsfönster för dokument (validFrom/validTo i create, PATCH och sökfilter). I web-app-document landade publika dokumentlänkar med PDF-förhandsgranskning.
- baa9451fix(frontend): simplify public pdf preview
- 5286160fix: show public document type display name
- fee6d43Merge pull request #45 from feat/public-document-links
- ac5b5e5WIP: Stage 1 of storage abstraction (BinaryStore + S3/JDBC impls)
- 7a6046ftest: Stage 1 storage abstraction follow-up
- 541fe4ffeat: attach original-filename + municipality-id as S3 user metadata
- a5c86b6fix: url-encode S3 user-metadata values
- 5312862fix: rfc 5987 content-disposition for non-ASCII filenames
- c2c5e65fix: reset response on binary-stream failure to avoid client hangs
- 485e5c2fix: pin S3 client to pre-v2.30 checksum behaviour for Garage
- 8995c7dfix: drop chunkedEncodingEnabled=false to avoid empty-body uploads
- c6ace82fix: downgrade aws-sdk to 2.29.52 for Garage compatibility
- 6881a68feat: add validFrom/validTo date fields to document create
- 23585b8feat: allow updating validFrom/validTo via PATCH
- 13aa2fefeat: add validOn filter to document search
- 3e29760test: seed realistic validity windows on IT dataset
Taggar
s3-lagring binarystore publicering mina-dokument revisions org-filter validity-window semantic-drift data-governance ai-automation
Nästa dag
Följa upp S3-övergången i drift och skissa på hur DB↔fil-kopplingen bevakas långsiktigt. Ta nästa steg kring Metakatalog-mappningen (kanonisk modell / BFF-översättning) och följa Cagris parallellspår för AI-stödd utveckling.
Anteckningar från standup
Dagens leveranser fördjupar produktupplevelsen: filförhandsgranskning i webbläsaren för Office-dokument, text, video och ljud, dokumentansvar (vem äger dokumentet) som egen entitet, samt ny revisionssemantik där revisionsnumret bara ökar när själva filen ändras. Parallellt lyftes en arkitekturfråga: så mycket applikationsunik logik växer fram att teamet vill utvärdera en dedikerad tjänst för dokumenthantering i stället för att pressa in allt i de generella mikrotjänsterna.
Möten & diskussioner
Dedikerad dokument-tjänst. Förslag lyftes om att bygga ut en egen tjänst för dokumenthantering. Motivet är att mängden applikationsunik logik — responsibilities, stage-and-save-semantik, metadatapolicy, validity-windows, publiceringsflöde — redan har växt bortom det generella mönster som mikrotjänsterna är designade för. Avvägningen: en domänspecifik tjänst ger bättre passform mot domänspråket och mindre tvång att anpassa sig till generella scheman, men innebär samtidigt ytterligare en tjänst att drifta och risk för fragmentering. Frågan kopplar tillbaka till semantic drift-tråden från Dag 3 — en egen tjänst löser inte mappningsproblemet mot Metakatalogen, men minskar pressen att följa andra tjänsters modeller.
Filförhandsgranskning. Diskussion om format-fidelity — särskilt pptx där rendering inte blir 100 %. Lösningen landade i att surfa upp en tydlig fidelity-notis via en ny Alert info-variant, snarare än att dölja begränsningen. Previewmodalen breddades för att få plats med Office-innehåll.
Revisionssemantik. Beslut att revisionsnummer endast ökar vid filändring. Metadataändringar spåras via updatedBy men bumpar inte revisionen. Detta förenklar användarnas mentala modell av "version" och gör revisionsnumret meningsfullt som verklig versionsmarkör. Frontend visar nu 1-baserade revisionsnummer.
Beslut & insikter
1. Förhandsgranskning i webbläsaren införd för Office, text, video och ljud — med fidelity-notis för pptx.
2. Dokumentansvar införs som ny entitet (username-only i första steget).
3. updatedBy-spårning ersätter createdBy vid uppdateringar.
4. Revisionsnummer ökar endast vid filändring.
5. Stage-and-save-flöde i frontend — filändringar appliceras vid explicit spara, inte direkt.
6. Striktare metadatapolicy: user-defined metadata-fält borttagna ur create-flödet.
7. Förslag att utvärdera en dedikerad dokumenttjänst — för stor andel applikationsunik logik för att leva enbart i de generella mikrotjänsterna.
8. Mindre fixar: token-maskering vid login, concurrency-säker registrationNumber, klickbara rader och normaliserad pointer-affordance.
Kodutveckling denna dag
Dagens leveranser grupperar sig i tre huvudspår: (1) filförhandsgranskning i webbläsaren (Office/text/video/ljud + pptx-fidelity-notis via ny Alert info-variant), (2) dokumentansvar och updatedBy-spårning — ny entitet i backend med migration V1_6, och (3) revisionslogik där revision bara ökar vid filändring. Därutöver landade stage-and-save i frontend med striktare metadatapolicy, samt säkerhets- och UX-fixar.
- ddfc5bbfix(frontend): make rows fully clickable and normalize pointer affordance
- 371b1e3fix(login): mask token input field
- cbf5017feat: use updatedBy instead of createdBy when updating documents
- 971d7f3fix(backend): enforce metadata key policy and normalize file revision actor
- 8997f1brefactor(frontend): remove user-defined metadata fields from create flow
- adb5d58feat(frontend): stage file changes and apply them on explicit save
- 21a2c5dfeat(frontend): show 1-based revision numbers in UI
- 4e285eafeat: add document responsibilities and updatedBy tracking
- a7a4a1afeat: preview office, text, video and audio files in browser
- 470e9b2fix(file-preview): render pptx correctly and surface fidelity notice as alert
- 3bf84c1feat(ui): add info variant to Alert component
- fd4c8e3feat(file-preview): widen preview modal and fit pptx to container
- 99c26c6fix: prevent duplicate registration numbers on concurrent first-time calls
- cb17c61refactor: simplify document responsibilities to username-only
- ca7adc2refactor: only increment revision on file changes
- b5b44f4feat: add updatedBy field, rename createdBy on update request
- 96d7174Merge pull request #9 from change-revision-logic
- e86d89bMerge remote-tracking branch 'origin/main' into feat/document-responsibilities
- b55b246build(db): bump responsibility migration to V1_6 to avoid collision
- 85f795erefactor: drop ineffective distinct() and document flush() rationale
- 83ca194Merge pull request #6 from feat/document-responsibilities
Taggar
file-preview office-preview responsibilities updated-by revision-logic stage-and-save metadata-policy security dedikerad-tjänst arkitektur
Nästa dag
Följa upp arkitekturfrågan om en dedikerad dokument-tjänst — skissa avgränsning mot de generella mikrotjänsterna. Utvärdera responsibility-modellen mot framtida behov (roller? grupper?) och se hur den nya revisionssemantiken landar hos användare.
Anteckningar från standup
Fredagen stängde första sprintveckan med tre tydliga leveranser: en fullständig statuslivscykel för dokument (DRAFT → ACTIVE → REVOKED med validity-fönster, schemalagd publicering och statusmedvetna publika länkar), ett färdigt individansvar där responsibilities nu kan slås upp via e-post eller användarnamn, samt ett arkitektoniskt vägval — lösningen ska byggas som en samlingstjänst där all dokumenthanteringslogik bor i en egen tjänst, medan övriga mikrotjänster bidrar med generell funktionalitet (användaruppslag, meddelanden, filer). Veckan avslutades med en genomgång av funktionslistan: grundfunktionerna är på plats, och vecka 2 får därmed prio på kvalitetshöjande AI-delar samt infrastruktur kring WOPI.
Möten & diskussioner
Statuslivscykel. Dokument har nu en explicit livscykel (DRAFT, ACTIVE, REVOKED) med giltighetsfönster. Det öppnar för schemalagd publicering — ett dokument kan skapas med framtida validFrom och publiceras automatiskt när datumet slår in. DRAFT togs först bort ur listans statusfilter, men återinfördes snabbt när det visade sig att användare behöver kunna hitta sina utkast. Publika länkar (/d/{regNr}) resolver numera till senaste ACTIVE-revision — icke-publika dokument syns inte i publika vyn.
Individansvar & användaruppslag. Ansvarskoppling mot person är nu på plats — men diskussionen kretsade kring hur man söker fram rätt individ. Dagens lösning slår upp på e-post eller användarnamn (auto-detect) via Metakatalog-integrationen. Målbilden framåt är fri sökning på namn, e-post eller användarnamn i Metakatalogens sök-endpoint, med listningspresentation där man väljer rätt individ. Det gör flödet mindre kunskapsberoende — användaren behöver inte känna till exakt username på den person som ska få ansvaret.
Arkitektur — samlingstjänst. Fortsättning på Dag 4:s tråd. Beslutet landade: lösningen byggs som en samlingstjänst där dokumenthanteringslogiken (livscykel, responsibilities, metadatapolicy, revisionssemantik) bor i en egen tjänst, medan generella behov — användaruppslag, meddelandeutskick, filhantering — konsumeras från övriga mikrotjänster. Det löser Dag 3:s semantic drift-tråd genom att dokumenttjänsten får äga sitt eget domänspråk, samtidigt som den generella infrastrukturen förblir generell. WOPI-integrationen är ännu inte påbörjad — läggs som infrastrukturspår i vecka 2.
Funktionslista & veckoavstämning. Hela funktionslistan gicks igenom — i stort sett alla grundfunktioner är införda under första veckan. Vecka 2 får prio på kvalitetshöjande AI-delar samt infrastrukturfokus på WOPI och test av denna integration.
Beslut & insikter
1. Statuslivscykel införd: DRAFT → ACTIVE → REVOKED med validFrom/validTo-fönster.
2. Schemalagd publicering möjliggjord via validity-fönster på create.
3. Publika länkar resolverar till senaste ACTIVE-revision; icke-publika dokument göms i publik vy.
4. Responsibility-tilldelning sker nu via e-post eller användarnamn (auto-detect) — fri namnsökning mot Metakatalogen är nästa steg.
5. Publish/revoke/unrevoke riktas mot en specifik revision i backend — inte dokumentet som helhet.
6. JDBC blob-lagring bortkopplad; S3/Garage är enda filbackend.
7. Arkitekturbeslut: bygg som samlingstjänst — dokumentdomänen i egen tjänst, generella behov via övriga mikrotjänster. WOPI läggs som infrastrukturspår i vecka 2.
8. Veckoavstämning: grundfunktioner på plats efter vecka 1 — vecka 2 prioriterar AI-kvalitet + WOPI.
Kodutveckling denna dag
Dagens leveranser grupperar sig i fyra spår: (1) statuslivscykel i både backend och frontend med publish-endpoint, validity-window, statusmedvetna listor och publika länkar, (2) responsibilities-uppslag med e-post/username-detektering och full directory-card i redigeringsvyn, (3) infrastrukturkonsolidering — S3/Garage som enda filbackend, auto-genererade frontend-DTOs från backend-OpenAPI — samt (4) en mängd polish-fixar kring revisionsval, landningssidor efter spara, duplicerade i18n-nycklar och token-recovery.
- 0c5f710refactor: auto-generate frontend DTOs from backend OpenAPI
- dbb45dafix(compose): expose EMPLOYEE_API_URL/PREFIX to backend container
- 282d6c1feat(responsibilities): add email lookup for assigning users
- 2f6afacfix(responsibilities): validate resolved users before save
- ebeecd5fix(backend): recover from revoked upstream tokens and preserve status
- 81b6f0dfeat(responsibilities): auto-detect email vs username with inline lookup
- b1b539afeat(my-documents): surface responsibilities and updatedBy
- 30842c3chore(i18n): drop duplicate keys, enforce parity in lint-staged
- 2dd87e2feat(responsibilities): render full directory card while editing
- 2aae9fafeat(documents): adopt lifecycle status model and validity window
- d4f1214feat(documents): wire dedicated publish endpoint and expose non-public docs
- 077d8c7feat(documents): require validity dates on create to avoid DRAFT state
- e1f6a5efeat(documents): make public-links section status aware
- 51ed60dfeat(documents): drop DRAFT from list status filter
- 8e3d270feat(documents): land on detail page after create
- eca1234feat(documents): confirm before saving would revert to draft
- 8d5beeefix(public): resolve permanent link to latest ACTIVE revision
- 5da5d38test(public): cover every revision-status combination for /d/{regNr}
- d0c6e7bfeat(public): show validity window instead of created timestamp
- e3b555dfeat(documents): require at least one responsible user
- de5f500fix(documents): allow file download/preview on DRAFT revisions
- 982b0faMerge pull request #61 — feat/document-status-lifecycle
- 1649e66fix merge conflicts (batch-file-upload-single-revision)
- 35ceaa8Merge pull request #10 — feat/batch-file-upload-single-revision
- cebab24Merge pull request #8 — feat/document-status-lifecycle
- b023e3dchore: drop JDBC blob storage, make S3/Garage the sole backend
- e3550d6Merge pull request #11 — chore/drop-jdbc-blob-storage
- bc7a246relax the requirement on metadata, may now be empty
- 5dd1936Merge pull request #12 — chore/drop-jdbc-blob-storage
- 3c7f99dfeat: target specific revision for publish/revoke/unrevoke
- cb5c012Merge pull request #13 — add-revision-for-status-changes
Taggar
status-lifecycle validity-window scheduled-publish public-links responsibilities email-lookup metakatalogen s3-garage dto-generation samlingstjänst arkitektur wopi-kommande
Nästa dag
Vecka 2 startar med fri namn-/e-post-/användarnamnssökning mot Metakatalogens sök-endpoint för responsibilities, samt första skisser på WOPI-integration och hur samlingstjänsten avgränsas mot övriga mikrotjänster. Parallellt lyfts kvalitetshöjande AI-delar som veckans röda tråd.
Anteckningar från standup
Vecka 2 öppnade med två parallella spår: en första demo av Dokumenthantering för verksamheten där hela den hittills utvecklade funktionsuppsättningen gicks igenom, samt en tyngre teknisk omstöpning där personId ersätter username som actor-identifierare genom hela stacken (backend responsibilities, frontend-DTOs, session/auth). Parallellt föll Tika-baserad textextraktion + Elasticsearch-sökning på plats i api-tjänsten och "Mina dokument" delades upp i två flikar. Demon landade starkt — verksamheten beskrev lösningen som en direktträff mot behoven och ville omedelbart börja testa.
Möten & diskussioner
Första demo av Dokumenthantering för verksamheten. Dagens huvudhändelse. Samtliga funktioner som utvecklats under vecka 1 gicks igenom — dokumentskapande, revisionshantering, statuslivscykel, publiceringsflöde, responsibilities, publika länkar, sök och listningar. På frågan om lösningen har bäring gentemot behoven var svaret entydigt ja — spontant citat: "Halleluja, när får vi det här?". Representanter från Vård och omsorg samt Individ och arbetsmarknad var tydligast positiva under sittningen. Verksamheten lyfte också konkret önskemål om att börja testa parallellt med pågående sprint.
PersonId som actor-identifierare. Backend och frontend skrevs om så att createdBy, updatedBy och responsibilities refererar personId (UUID) istället för username. Motivet: username kan byta form (e-post vs AD-namn) över tid och kräver upprepade uppslag mot Metakatalogen; personId är stabil och gör actor-kedjan entydig. Sessionen berikas nu med personId från employee-tjänsten vid inloggning så att frontend slipper runda vägen via uppslag. Ändringen drogs igenom som egen datacontract-commit (d580a36) följt av synkad DTO-uppdatering på frontend och validering av actor-fält som personId UUIDs på backend.
Mina dokument — egna flikar. "Mina dokument"-vyn delades upp i Skapade av mig och Mina ansvar — två distinkta listor istället för en blandad, vilket speglar att ansvar och författarskap ofta inte sammanfaller. Kompletterar förra veckans responsibility-arbete.
Department pre-fill från organisationsträdet. Vid dokumentskapande förifylls nu department från användarens portal-person-organisationsträd. Minskar manuellt fält-arbete och gör att första versionen av ett nytt dokument automatiskt får rätt organisatorisk hemvist.
Tika + Elasticsearch på backend. api-service-document extraherar nu text från uppladdade filer via Apache Tika och indexerar i Elasticsearch — ?query= på list-endpointen söker sedan över både metadata och filinnehåll. Wildcard-queries slopades i samma svep eftersom Elasticsearch hanterar tokenisering själv. Integrationstestsviten primar nu Elasticsearch explicit.
Mock-användare & auth-cachefixar. Mock-listan ersattes med verkliga test-konton inför demon. Under dagen upptäcktes att http-cache på /me och /mock-users kunde ge kvarlevande sessioner — nu sätts cache-bypass på dessa samt en fallback till default-mock när cookien är förfallen.
Beslut & insikter
1. Första demo för verksamheten — starkt positivt mottagande, explicit önskemål om att börja testa.
2. Vård och omsorg + Individ och arbetsmarknad är de tydligast intresserade förvaltningarna — rimliga första testkandidater.
3. Actor-fält (createdBy, updatedBy, responsibilities) byter identifierare till personId (UUID) — username ersätts genom hela stacken.
4. Session berikas med personId från employee-tjänsten vid inloggning.
5. "Mina dokument" delas i Skapade av mig + Mina ansvar.
6. Department förifylls från användarens organisationsträd vid nytt dokument.
7. Tika-baserad textextraktion + Elasticsearch-sökning införd — ?query= söker både metadata och filinnehåll.
8. Prioritering vecka 2: sökfunktionen lyfts fram som eget fokusspår vid sidan av tidigare beslutad AI-prioritering — dagens Tika + Elasticsearch-grund bygger vidare mot relevansrankning, filtrerad sök och sökbarhet över hela dokumentkroppen.
9. Insikt till kommande sprint: deltagare från produktion behöver vara med — minimum på standups — för input kring teknisk lösning när valet bedöms påverka IT-infrastruktur.
Kodutveckling denna dag
Dagens commits grupperar sig i fyra spår: (1) personId-datacontract som skrivs igenom både backend (responsibilities + actor-validering) och frontend (DTO-alignment, rendering från personId, session-berikning), (2) skapa-flödet med department pre-fill från organisationsträdet och robusthet kring DRAFT-återhämtning när upstream returnerar tomt body eller 404, (3) Mina dokument-flikar samt preview/revoke på SCHEDULED publika länkar, och (4) backend-sökning via Tika textextraktion + Elasticsearch — tillsammans med en housekeeping-refaktor som skiljer filoperationer och event-loggning från DocumentService.
- be06112feat(my-documents): split into 'created by me' and 'my responsibilities' tabs
- 12a13fafeat(documents): pre-fill department from user's portal-person org tree on create
- 0dbd588feat(document-detail): preview and revoke SCHEDULED public links
- e9dfd0ffix(documents): land on detail page after create
- c4fe452fix(documents): pass includeNonPublic on create so upstream returns the DRAFT
- 3c0b377fix(documents): re-fetch created DRAFT when upstream POST returns 404
- 7de9228fix(documents): refetch new document via Location header when body is empty
- d580a36feat: datacontract
- 931dbb8feat(auth): enrich session with personId from employee service
- bda8cdfrefactor(documents): align DTOs with new datacontract
- a66ee6drefactor(documents): use personId for actor fields
- 5163383refactor(documents): render responsibilities and actors from personId
- d818c1efix(document-types): use user.personId for createdBy and updatedBy
- 50722bfchore(mocks): replace mock users with real test accounts
- c6c30e8build: add CACHEBUST arg and force-dynamic on api proxy
- b4ed301fix(auth): fall back to default mock user when cookie is stale
- 3e55053fix(login): bypass http cache on /me and /mock-users fetches
- 6988459refactor: split file ops and event logging out of DocumentService
- fcfe73ffeat: extract file text with Tika and serve ?query= from Elasticsearch
- 1ee27a7Merge pull request #15 — housekeeping
- 8f5ed7erefactor: use personId instead of username on responsibilities
- 2fc494cMerge pull request #16 — refactor/responsibility-person-id
- 5d953a3refactor: validate actor fields as personId UUIDs
- ebd14eaMerge pull request #17 — refactor/actor-fields-personid
- ca7849ftest: prime Elasticsearch in the IT suite and drop wildcard query support
- 317c091test: raise coverage on TikaTextExtractor and DocumentIndexEntity
Taggar
demo verksamhetsfeedback personid datacontract actor-fields responsibilities session-enrichment org-tree my-documents tika elasticsearch mocks sök-fokus-v2 produktion-i-standups
Nästa dag
Uppföljning av demons mottagande — hur Vård och omsorg samt Individ och arbetsmarknad kan komma in och testa parallellt med sprintens fortsatta utveckling. Tekniskt blir sökfunktionen eget fokusspår vecka 2 tillsammans med den tidigare beslutade AI-prioriteringen — dagens Tika + Elasticsearch-grund får bära vidare mot relevansrankning och fritextsök över hela dokumentkroppen. Parallellt ligger första skisser på WOPI-integration. Sprintrytmen vecka 2 justeras så att produktion kan lyssna in på standups inför arkitekturfrågor som påverkar IT-infrastrukturen.
Anteckningar från standup
Tisdagen följde upp måndagens två stora spår: sök-prioriteringen gick från backend-grund till verklig användarnytta när /documents/file-matches började returnera highlightade träff-fragment per fil, och personId-migrationen stängdes genom sin merge. Utöver det landade två nya funktioner: en attention-modul på dashboarden som lyfter dokument som behöver åtgärd, och ett obligatoriskt titelfält som blir dokumentets primära rubrik genom hela stacken. Dagen avslutades med polish-fixar kring långa titlar, sidomenyn och icke-ASCII-filnamn.
Möten & diskussioner
Sök-fragment — steg två i sök-spåret. Backend-sökningen som lades in Dag 6 (Tika + Elasticsearch) byggdes ut: ny endpoint /documents/file-matches returnerar nu en lista över filer som matchar en fritextsökning, där varje fil levererar matchade fragment via ES highlighting. Det innebär att ett träfflistresultat kan visa var i dokumentet sökordet dök upp, istället för bara att dokumentet innehöll ordet. DocumentMapper delades upp per ansvar och sök-service-metoderna gjordes symmetriska för att tydliggöra page-local-semantiken. Direkt uppföljning av gårdagens beslut att lyfta sök som eget fokusspår vecka 2.
Dashboard — attention-signaler. Dashboarden fick en ny modul som lyfter fram dokument som behöver uppmärksamhet (snart utgående validity, saknade ansvariga, dokument i DRAFT-state osv). Modulen extraherades som eget feature-paket (refactor(dashboard): extract Attention feature module) och fick warn-style ikoner samt table-aligned rader för att se ut som en action-lista snarare än ännu en statistikruta. Samma attention-signaler speglas nu också på detalj-sidan för enskilda dokument. Sample-query-chipsen i sök-hero-sektionen togs bort eftersom attention-listan gör mer nytta som första vy.
Titelfält som primär rubrik. Dokumentmodellen utökades med ett obligatoriskt title-fält på både backend och frontend. Tidigare härledde vyerna en rubrik från metadata, men det gav skakiga rubriker och svårsökbara dokument. Nu leder titeln i alla listningar och på detalj-sidan, med status placerad bredvid istället för ovanför. Dokument-tabellens kolumnordning byttes så att titeln kommer först, och långa titlar klampas i UI:t för att skydda layouten. Datacontract-commiten (7f381a1) synkade frontend-DTOs med den nya modellen.
PersonId-migration stängd. Gårdagens stora refaktor (createdBy, updatedBy, responsibilities → personId UUIDs) mergades in via PR #69. Datakontraktet är nu enhetligt genom hela stacken.
Admin-gating & polish. Sektionen för dokumenttyper göms nu bakom canManageDocumentTypes-behörighet. Parallellt röjdes sidomenyn — den dubbla "skapa dokument"-entrén försvann — och backend fick en fix för multipart-uppladdningar där filnamnet innehåller icke-ASCII-tecken (åäö m.fl.).
Beslut & insikter
1. Sök-spåret levererar nu highlightade fragment per fil via /documents/file-matches — nästa steg är att exponera träff-snippets i frontend-listan.
2. Dokument får obligatoriskt title-fält som primär rubrik genom hela stacken — metadata-härledda fallback-rubriker fasas ut.
3. Dashboardens förstavy blir attention-driven — dokument som behöver åtgärd lyfts före statistik/sample-queries.
4. Attention-signalerna speglas även på dokumentets detalj-sida så att samma signal följer med in i redigeringsflödet.
5. Dokumenttyp-administration gateas via canManageDocumentTypes.
6. PersonId-migrationen är nu mergad och datakontraktet enhetligt i hela stacken.
7. Multipart-filuppladdning hanterar icke-ASCII-filnamn korrekt.
Kodutveckling denna dag
Dagens commits grupperar sig i tre huvudspår: (1) dashboard attention-modul — ny feature-modul som surfar åtgärdskrävande dokument, extraherad som eget paket, med warn-ikoner, spegling på detalj-sidan och borttagna sample-query-chips, (2) titelfält som primär rubrik genom hela stacken — obligatoriskt på backend, datacontract-uppdatering, frontend-vyer som leder med titel, tabell-kolumner omordnade och klampade långa titlar, (3) sök-fragment — ny /documents/file-matches-endpoint med ES highlighting, symmetriska service-metoder och DocumentMapper uppdelad per ansvar. Därutöver stängdes personId-migrationen via merge, sidomenyn röjdes, multipart icke-ASCII-filnamn fixades, och dokumenttyp-admin gateades bakom behörighet.
- dd65f49fix(api-proxy): disable fetch cache on backend forward
- c80bf49Merge pull request #69 — feat/document-personid-migration
- 83cf431feat(dashboard): surface actionable attention items
- 51e7d2arefactor(dashboard): extract Attention feature module
- 2fa787afeat: sort changes
- b86437frefactor(dashboard): warn-style icons and table-aligned rows on attention list
- 14b65e6refactor(dashboard): drop sample-query chips from search hero
- 67f5dc7fix(backend): repair multipart filenames with non-ASCII characters
- 4e0ab07feat(document-detail): surface attention signals on the document page
- 7606ae6feat(dashboard): stack secondary attention signals on the list row
- 7f381a1feat: data-contract
- 89c5e76Merge pull request #70 — feat/dashboard-attention-signals
- 528bfe0feat(document): introduce title field as primary document heading
- 3fee1befeat(admin): gate document-types section behind canManageDocumentTypes
- 73d9025refactor(document): lead with title, align status beside it
- 95ce017refactor(dashboard): drop the municipality counts sentence
- c3b6911fix(document-list): align document-table header with the swapped cell order
- af50ec2refactor(frontend): adopt shadcn primitives and split title fallback
- 63ea51cMerge pull request #71 — feat/document-title
- 7dc64adrefactor(sidebar): drop redundant create-document entry
- ea8d1cefix(document-title): clamp long titles to protect layout
- 0e07886Merge pull request #72 — feat/document-title
- a51e04cMerge pull request #18 — text-search
- 08868f8feat: add mandatory title field to Document
- ea80324Merge pull request #19 — add-title
- 2a9b9c0feat: add /documents/file-matches fulltext search endpoint
- e221d01refactor: symmetric search service methods + clarify page-local semantics
- b63812drefactor: split DocumentMapper by responsibility
- cc4f08efeat: return matched fragments per file via ES highlighting
- eab008cMerge pull request #20 — add-file-search
Taggar
attention-signals dashboard document-title datacontract shadcn search-highlighting file-matches elasticsearch admin-gating multipart-fix sök-fokus-v2
Nästa dag
Exponera sök-fragmenten i frontend-träfflistan så att användaren ser snippets inline — naturlig fortsättning på dagens backend-leverans. Vidare utbyggnad av attention-modulen med fler signaltyper (t.ex. saknade metadatafält, gamla revisioner), och första skisser på WOPI-integration för att kunna öppna Office-filer direkt från detalj-sidan.
Anteckningar från standup
Onsdagen levererade två hela spår i funktionell form: (1) Elasticsearch-baserad fritextsökning är nu på plats i frontend och söker blixtsnabbt över hela dokumentbeståndet — träffarna visar informationsstycken inuti dokumentet som matchar sökningen, inte bara dokumenttitlarna, och kan filtreras på dokumenttyp och status. (2) Användningsstatistik på filnivå som räknar varje läsning — även när en fil öppnas via intranätet — och ger oss grunden för en aktiv förvaltning där styrande dokument kan följas upp på hur de faktiskt används. Parallellt lyftes en diskussion om integrationen mot Public 360 och en framåtblick mot sprintens AI-spår via MCP med demo i Eneo.
Möten & diskussioner
Elasticsearch-sök i frontend. Backend-endpointen /documents/file-matches från Dag 6–7 är nu inkopplad i webbapplikationen. En sökning från dokumentlistan träffar fullständig metadata + hela dokumentkroppen via Elasticsearch, och UI:t visar match-fragment per fil i accent-regel-layout så det går att se var i dokumentet träffen sitter. Backend fick stöd för flera OR:ade queries, filtrering på status + dokumenttyp, och DocumentMatch returnerar nu registreringsnummer och revision så varje träff kan länkas direkt till rätt dokumentversion. Sök-hero:n på landningssidan togs bort eftersom den primära söklistan nu ligger direkt i dokumentvyn.
Användningsstatistik som grund för aktiv förvaltning. Varje gång en fil läses — inklusive när den öppnas via den publika /d/{regNr}-länken från intranätet — räknas det som en användning och syns i Dokumenthanteringens statistik. Det skapar fundamentet för en aktiv förvaltning där styrande dokument inte bara publiceras utan också följs upp: vilka dokument används faktiskt, av vilka, hur ofta? PDF-förhandsvisningar dedupliceras via blob-buffring för att inte räknas dubbelt, publika download-routes prefetchas inte av klienten (vilket annars skulle inflatera siffrorna), och observability-loggar lades till på nyckelvägar i backend för att göra statistikinsamlingen verifierbar.
Public 360-kopplingen — första läget. Diskussion fördes om relationen mellan Dokumenthanteringen och Public 360. Landningen: i första läget skapar vi en referens till ärendenummer samt en länk till beslut från ett dokument — ingen djup integration initialt, utan en enklare koppling som gör det möjligt att navigera från styrande dokument till dess bakomliggande ärende och beslut i Public 360. Djupare dataflöde kan utvärderas när grundkopplingen är verifierad i drift.
Framåt — AI-förmågor och MCP. Sprintens sista dagar vrids mot AI-spåret. Målbilden: exponera dokumentbeståndet via MCP (Model Context Protocol) så att AI-tjänster kan söka i alla styrande dokument. En konkret demo byggs i Eneo som söker över styrande dokument via MCP-kopplingen — naturlig fortsättning på dagens Elasticsearch-grund som redan gör hela dokumentkroppen sökbar.
Published-revision som publik norm. Parallellspår: publika vyer föredrar nu senaste publicerade revision — tidigare kunde en nyare DRAFT lysa igenom. DocumentStatus flyttades från sträng-union till enum för tydlighet i typsystemet, och swap-logiken flyttades in i Express-lagret.
Filhantering & lifecycle-fixar. En knippe buggfixar kring filrevisioner landade — filuppladdningar batchas nu till en enda revision (tidigare en per fil), filborttagningar sekventieras för att undvika index-race, och efter spara landar användaren på den just sparade revisionen. PUT /files kan nu också ta bort filer i samma revision. Lifecycle-endpoints (publish/revoke/unrevoke) ytbehandlar upstream 409-konflikter så att frontend kan hantera dem tydligt.
Beslut & insikter
1. Elasticsearch-baserad fritextsökning live i frontend — träffar inkluderar matchade fragment inuti dokumentet och filtreras på typ + status.
2. Användningsstatistik per fil på plats — inkluderar läsningar via intranät/publika länkar. Grunden för aktiv förvaltning.
3. PDF-förhandsvisningar dedupliceras via blob-buffring; publika download-routes prefetchas inte (så statistiken håller).
4. Public 360: första läget = referens till ärendenummer + länk till beslut. Ingen djup integration initialt.
5. Publika vyer föredrar senaste publicerade revision; DocumentStatus konverterad till enum i backend.
6. Filuppladdningar batchas till en revision; filborttagningar sekventieras; PUT /files kan också ta bort.
7. Lifecycle-endpoints (publish/revoke/unrevoke) bubblar upstream 409-konflikter.
8. Nästa spår: AI-förmågor via MCP — exponera dokumentbeståndet så AI-tjänster kan söka, med demo i Eneo som söker styrande dokument.
Kodutveckling denna dag
Dagens commits fördelar sig över fem spår: (1) Elasticsearch-baserad fritextsök på frontend (ny sökvy med match-cards, typ/status-filter), backend stöder multi-OR queries och utökad filtrering, (2) användningsstatistik — publika usage stats, PDF-dedupe via blob-buffring, förhindrat prefetch av publika download-routes, observability-loggar på nyckelvägar, (3) published-revision som publik norm — publika vyer och listrader swappar till senaste publicerade revision, DocumentStatus → enum, (4) filhantering & revisioner — uppladdningar batchas, borttagningar sekventieras, PUT /files kan ta bort, revision-URL-param alignad, landar rätt revision efter spara, (5) lifecycle & polish — 409-hantering för publish/revoke/unrevoke, form-refaktor till Card/Field-primitives, titelklampning, husky-hooks och LF-line-endings.
- 80f5983fix(document-list): cap title column width so other columns stay visible
- 55b16a0refactor(document-create): migrate form to Card and Field primitives
- a61f15cfix(lifecycle): surface upstream 409 for publish/revoke/unrevoke
- e00cdf0feat: data-contract update
- cbd0538feat(documents): prefer latest published revision on public views
- ecfa9d5feat(documents): swap list rows to the latest published revision
- 621202arefactor(documents): move published-revision swap into Express
- a1ada9arefactor(dashboard): remove search hero from landing page
- c00253erefactor(backend): convert DocumentStatus string union to enum
- 0cadc14feat(documents): surface public usage statistics
- 3d16b46fix(documents): don't prefetch public download routes
- 243551afix(documents): scope admin file reads to the displayed revision
- 75b8b29fix(documents): dedupe PDF preview view counts via blob buffering
- 1ac6a68fix(documents): batch file uploads into a single revision
- 458f4abfix(documents): align revision URL param with the 1-based display number
- f103814fix(documents): sequence file deletions to avoid revision-index race
- 0cd865afix(documents): land on the just-saved revision after save
- b4559a0Merge pull request #77 — feat/documents-usage-statistics
- afc7092feat(documents): add Elasticsearch-backed full-text search
- 018ec42refactor(documents): tighten search UI after self-review
- 6b1d6c5style(documents): adopt accent-rule layout for full-text match cards
- 484420efeat(documents): combine type + status filters with full-text search
- b4cf7e3chore: add observability logs to key service paths
- 6ac32a8Merge pull request #21 — add-file-search
- 4e9bac8feat: support multiple OR'd queries on /documents/file-matches
- 79d4e21refactor: split DocumentService by responsibility + extract response hydrator
- 834fb23feat: allow PUT /files to also delete files in the same revision
- 9ccf8fafeat: include registrationNumber and revision on DocumentMatch
- 63b0f82feat: support statuses and documentTypes filters on /documents/file-matches
Taggar
elasticsearch fulltext-sök match-fragments usage-statistics aktiv-förvaltning published-revision file-revisions lifecycle-409 sök-fokus-v2 public-360 mcp-kommande eneo-demo
Nästa dag
Sprintens sista dagar öppnar AI-spåret. MCP-integration ska göra dokumentbeståndet sökbart via AI-tjänster, med en demo i Eneo som söker styrande dokument. Public 360-kopplingen påbörjas som enkel ärendenummer-referens + beslutslänk. Användningsstatistiken får tid att ackumulera verkliga datapunkter inför avstämning.
Anteckningar från standup
Torsdagen var startskottet för sprintens AI- och MCP-spår. Arbetet med att exponera dokumentbeståndet via MCP (Model Context Protocol) påbörjades — grunden för att AI-tjänster ska kunna söka i alla styrande dokument, med demo i Eneo som planerat nästa steg. Parallellt fortsatte fördjupningen av fritextsöket i webbappen med en ny PDF-baserad förhandsvisning som markerar träffarna direkt i dokumentet, och backend fick en statistik-overview-endpoint plus en seed-CLI för testdata.
Beslut & insikter
1. AI-/MCP-spåret är startat — fokus framöver är att göra dokumentbeståndet sökbart för AI-tjänster via MCP.
2. Fritextsöket har nu en integrerad PDF-förhandsvisning med highlight-overlay som walkar renderad DOM och markerar träffar direkt i sidan.
3. Fritextsöket tolererar ordordning och stavfel — söket blir robustare mot verkligt användarbeteende.
4. Backend har nu en document statistics overview-endpoint + en seed-testdata-CLI för att snabbt fylla tjänsten med testdata inför demos.
Kodutveckling denna dag
Dagens commits fördelar sig över tre spår: (1) fördjupat dokumentsök i frontend — ny PDF-page-viewer baserad på react-pdf med text-layer, highlight-overlay som markerar träffar i renderad DOM, match-navigator och per-view-status-defaults, (2) statistik + seed-verktyg i backend — statistics-overview-endpoint och en seed-testdata-CLI, (3) sökrobusthet — tolerans för ordordning och stavfel i fritextsöket.
- 51b230drefactor(documents): surface default status filter as visible chips
- a7f2aa8style(documents): group editable fields on second detail row
- 8be54f6fix(documents): guard list and match fetches against race conditions
- 7a55a03fix(backend): stop hpp from flattening multi-value filter params
- d646779style(statistics): label revision bars with full name, shorten when crowded
- 126e29cfeat(filters): per-view status defaults and a truly empty clear target
- a3fe2d0Merge pull request #78 — feat/documents-fulltext-search
- 947a533feat(search): add page, extraction-status and match-positions to FileMatch
- a3c4369feat(search): pure logic for match navigation and query term extraction
- 3d52427feat(search): add highlight overlay that walks rendered DOM for matches
- 8d4da21feat(search): add PDF page viewer and match navigator primitives
- d440837feat(search): compose file preview sheet from navigator and overlay
- 2dbac5frefactor(search): swap preview sheet for centered dialog with top toolbar
- 76e8b2cfeat(preview): unify PDF rendering on react-pdf with text layer
- 0a62188feat: tolerate word order and typos in document full-text search
- 4b5a7edfeat: add document statistics overview endpoint
- bd7fcedtest: make DocumentStatisticsOverviewIT seed dates scheduler-proof
- 6be8132Merge pull request #23 — feat/document-statistics
- 394884dfeat: add seed-testdata CLI for populating the service with test data
- 0c255b8Merge pull request #24 — seed-testdata
Taggar
ai-spåret mcp eneo pdf-preview highlight-overlay match-navigator sök-robusthet statistics-overview seed-testdata
Nästa dag
MCP-kopplingen fortsätter — målet är en körande demo i Eneo som söker över styrande dokument via MCP mot dokumentbeståndet. Parallellt fortsätter finslipning av PDF-previewn och sök-UX:en från dagens arbete.
Anteckningar från standup
MCP är på plats och har integrerats mot Dokumenthanteringens funktioner. AI kan nu söka i alla dokumentdetaljer via den Elasticsearch-baserade sökning som byggts upp under veckan, och tar samtidigt hänsyn till inloggad person — frågor som "Vilka dokument är jag ansvarig för?" kan nu besvaras direkt. För AI-förmågan inne i Dokumenthanteringen används Eneo: MCP:n från Dokumenthanteringen är ansluten till Eneo, som sköter all orkestrering och AI-interaktion runt omkring. Parallellt levererades fortsatt finslipning av fritextsök- och PDF-previewupplevelsen inför demon.
Möten & diskussioner
MCP-tjänsten lever. Ett nytt repo — api-service-document-mcp — scaffoldades och fick under dagen en read-only tool-yta ovanpå api-service-document, inklusive en document filter tool som låter AI filtrera dokumentbeståndet på samma sätt som UI:t. MCP:n exponeras över streambar HTTP med bearer-auth, vilket gjorde det möjligt att koppla in Eneo som orkestreringslager utan ytterligare integrationsarbete på klientsidan.
Eneo som AI-lager. Beslutet att använda Eneo som värd för själva AI-dialogen innebär att Dokumenthanteringen kan hålla sig strikt till att exponera sina förmågor via MCP — sök, filtrering, dokumentdetaljer — medan Eneo tar hand om LLM-anrop, kontext och användarflöde. Att MCP-tjänsten identifierar inloggad person via bearer-token gör att svar kan personifieras (ansvar, ägarskap, egna dokument) utan att AI:n behöver hantera auktorisering själv.
Inför slutdemo på måndag. Måndagens möte blir både demo nr 2 och slutdemo med verksamheten. Fokus ligger på sökfunktion och AI-förmåga, med övrig veckas utveckling som komplement. Intern snabbslutsats i teamet: vi har kommit mycket längre än vi någonsin hade kunnat hoppas på. Slutlig retro och utvärdering sker nästa vecka när verksamhetens input från slutdemon är inne.
Beslut & insikter
1. MCP live — api-service-document-mcp scaffoldad och integrerad mot Dokumenthanteringens funktioner.
2. AI söker i alla dokumentdetaljer via Elasticsearch-implementationen från Dag 8.
3. AI:n tar hänsyn till inloggad person — kan svara på "Vilka dokument är jag ansvarig för?" och liknande personaliserade frågor.
4. Eneo används som orkestrerings- och AI-lager; MCP:n kopplas in via streambar HTTP med bearer-auth.
5. Måndagens möte = slutdemo med verksamheten. Fokus på sökfunktion och AI, plus veckans övriga leveranser.
6. Intern snabbslutsats: teamet har kommit mycket längre än förhoppat — slutlig retro nästa vecka efter verksamhetens input.
Kodutveckling denna dag
Dagens commits fördelar sig över två spår: (1) ny MCP-tjänst — scaffolding, read-only tool-yta mot api-service-document, streambar HTTP med bearer-auth samt en document filter tool, (2) sök- & previewpolish i webbappen — mobilvänlig bottom-sheet för PDF-preview, pdfjs-worker-fixar (docker + asset-URL), snippet-kollaps efter tredje träffen och numrering av upprepade excerpter.
- 85c4036chore: scaffold api-service-document-mcp
- 956a05cfeat: add read-only MCP tools over api-service-document
- 09d757efeat: expose MCP over streamable HTTP with bearer auth
- 6a8d9a7feat: add document filter tool
- daadc11fix(preview): serve pdfjs worker from /public instead of webpack asset URL
- 28ba8c6feat(search): swap preview dialog for a bottom sheet on mobile
- f395186refactor(layout): align useIsMobile with the app's md breakpoint
- 58ed8a8fix(docker): skip postinstall in deps stage, run worker copy in builder
- e6e2ccffix(preview): resolve pdfjs worker through react-pdf's own dep tree
- c4553f7feat(search): collapse file snippets past the first three
- 8dfdc3crefactor(search): outline each snippet and number repeated excerpts
- 1250f44Merge pull request #80 — feat/search-inline-preview
Taggar
mcp-live eneo ai-personifierat bearer-auth streamable-http document-filter-tool pdf-preview-polish mobile-bottom-sheet slutdemo-måndag
Nästa dag
Måndag 2026-04-27: slutdemo med verksamheten — demo nr 2 tillika sprintens avslutning. Fokus ligger på sökfunktion och AI-förmågan via MCP+Eneo, med veckans övriga leveranser som stöd. Slutlig retro och utvärdering nästa vecka när verksamhetens input är insamlad.
Vad som visades
Slutdemo med verksamheten där vecka 2:s funktionalitet stod i centrum. Fyra spår presenterades skarpt: avancerad sök, AI-förmåga via MCP, notifikationer och användningsstatistik.
Avancerad sökfunktion. Söker över all data i ett dokument — inte bara titel och metadata utan hela innehållet. Träffarna visualiseras direkt: den textmassa inuti dokumentet som matchade lyfts fram, och förhandsvisningen markerar sökorden i själva dokumentet. Söket hanterar dessutom felstavningar i båda riktningar — användaren kan stava fel och dokumentet kan vara felstavat, träffen hittas ändå.
AI-förmåga via MCP. Den MCP-tjänst som utvecklats gentemot Dokumenthanteringen kan hitta rätt dokument, svara på frågor utifrån individens roll och behörighet, och därmed ersätta egna nischade appar — exempelvis behöver hemtjänsten ingen separat app för att nå sina rutiner; samma fråga ställs och AI:n svarar utifrån vem som frågar.
Notifikationer. Användare får automatisk avisering när ett dokument är på väg att gå ut, eller när ett dokument tappat sin ansvariga — t.ex. då en person slutat i kommunen och dokumentet därmed står utan ägarskap.
Användningsstatistik. Varje dokument bär statistik på antal nedladdningar och läsningar. Administratörers användning av gränssnittet räknas inte in — endast extern, faktisk användning genererar statistik. Det gör det möjligt att följa vilka dokument som faktiskt används och vilka som ligger orörda. Statistiken är dessutom grunden för en framtida förvaltningsvy, där ansvariga inom en förvaltning kan få överblick över all dokumentanvändning inom förvaltningen.
Synpunkter från verksamheten
Ett önskemål lyftes: möjlighet att styra vad som händer med ett dokument när giltighetstiden löper ut. Tekniskt inget problem att lösa, men har inte rymts inom sprinten — tas med till framtida utveckling.
Enhälligt Ja från verksamheten
På frågan om lösningen har bäring och uppfyller behov i verksamheten svarade samtliga deltagande verksamheter Ja. Både Vård och omsorg och Individ och arbetsmarknad ser behov av att komma igång så snabbt som möjligt — lösningen löser både rena verksamhetsbehov och möjliggör uppfyllnad av lagkrav kring kvalitet och uppföljning.
Parallellt genomförs en uppföljning av sprinten för att lära av den och bygga systematiska arbetssätt utifrån erfarenheten, samt utvärdera vad som rent tekniskt återstår innan lösningen är redo att börja användas i produktion. Utvecklarna bekräftar samtidigt att allt är helt korrekt byggt och direkt användbart — inget "fulbygge" under sprinten bara för att visa en fin yta, allt är robust och skalbart.
Kodutveckling denna dag
Demodag — fokus på presentation och dialog med verksamheten. Parallellt levererades finslipning av dokumentdetaljkortet i webbappen: sektionerad layout, tightare metadata-typning samt nytt fält för diarienummer och ärende-länk så att dokument kan kopplas direkt till sitt ärende.
- f687b5afeat(documents): add diarienummer and case link to documents
- 3c9fd8crefactor(documents): tighten metadata layer ownership
- 14e3239refactor(documents): tighten metadata typing and switch native fields to register
- e44d418refactor(documents): make MetadataLabels strict and prune dead Zod messages
- 5c7ccbarefactor(documents): sectioned layout for the detail card
- 0c460daMerge pull request #82 — feat/case-fields-on-documents
Taggar
slutdemo-genomförd enhälligt-ja uppskalning-bereds avancerad-sök ai-mcp notifikationer användningsstatistik förvaltningsvy mål-beslut-maj produktion-efter-sommaren
Nästa steg
Uppföljning & retro av sprinten — lära av arbetssättet och systematisera. Teknisk avstämning av vad som återstår innan produktionsstart. Beslutsärende för uppskalning förbereds av Jari Koponen & Maria Granqvist. Önskemålet om dokuments efterlivshantering (vad som händer när giltighetstiden går ut) går in i framtida utvecklingslista.
Retrospektiv genomfört
Retrospektivet med teamet är nu genomfört och sammanställt. Genomgående positiva erfarenheter kring fokus, samarbete och leveranstakt — sex framgångsfaktorer och fem förutsättningar bör tas vidare när formatet återanvänds, samtidigt som tre risker (kognitiv belastning, teknisk skuld och förväntningsraketen) behöver hanteras aktivt innan arbetssättet skalas upp.
Övriga aktiviteter
Återstår att dokumentera löpande: teknisk genomgång inför produktion samt beslutsärendet för uppskalning. Målbild — beslut i maj 2026, produktion igång senast direkt efter sommaren.
En tvåveckors test — och ett enhälligt ja.
Innovationssprinten kring dokumenthantering var lika mycket en metodtest som ett produktbygge. Hypotesen: ett tvärfunktionellt team utan mellanlager, parad med AI som aktiv medarbetare, kan leverera mätbar verksamhetsnytta på två veckor — något som tidigare har kostat månader. Slutdemons enhälliga ja och det efterföljande retrospektivet bekräftar bilden — och pekar ut vilka villkor som måste vara på plats för att formatet ska gå att skala.
Sprinten levde efter sin egen metod.
En liten kärna byggdes klar tidigt, hypotesen verifierades i en första demo halvvägs in, vecka 2 prioriterades om utifrån verksamhetens reaktioner — och AI-spåret tilläts vänta tills grunden bar.
Vecka 1 byggde fundamentet. Dag 1–2 etablerades infrastrukturen — appen gick live på documents.sundsvall.dev redan dag 2. Dag 3–4 flyttades filer ut ur databasen till S3, filförhandsgranskning landade, och två stora arkitekturfrågor lyftes (semantic drift mot Metakatalogen och om dokumenthantering förtjänade en egen tjänst). Dag 5 stängdes veckan med en fullständig statuslivscykel, individansvar och det viktiga arkitekturbeslutet att bygga en samlingstjänst.
Vecka 2 vred mot kvalitet och AI. Dag 6 inledde med första verksamhetsdemon — så positiv att den blev en vändpunkt. Dag 7–8 byggdes söket ut hela vägen till frontend, dashboarden fick en attention-modul och användningsstatistik på filnivå lades in. Dag 9–10 öppnades AI-spåret — api-service-document-mcp kopplades mot Eneo som AI-orkestreringslager.
"Halleluja, när får vi det här?"
Spontant citat, första demo med verksamheten · Dag 6
Resultatet är slående: efter en första demo redan på dag 6 landade slutdemon i ett enhälligt ja från verksamheten, och beslut om uppskalning bereds. Vård och omsorg samt Individ och arbetsmarknad pekades ut som de tydligast intresserade förvaltningarna — naturliga första testkandidater.
Sprintens logg.
Tio arbetsdagar, två tydligt olika veckor. Nedan en kondenserad rytm — varje dag bär sin huvudleverans, sin egen ton, och en eller två taggar som ringar in fokuset.
Grundapp live, riskanalys med Claude
S3-lagring & semantic drift-tråden
Filpreviews & dedikerad tjänst?
Statuslivscykel & samlingstjänst-beslutet
Första demo för verksamheten + Tika-sökning
Attention-signaler, titelfält & sök-fragment
Elasticsearch-sök i frontend & användningsstatistik
AI- & MCP-spåret påbörjat
MCP live, AI i Eneo
Tre teman vävde igenom hela sprinten.
Sök växte från bifunktion till huvudvärde.
Det började som en standardlistning. Efter Tika-integrationen dag 6 lyftes sök till eget fokusspår och slutade som en av fyra demo-pelare — fritextsök i hela dokumentkroppen, fragment-highlighting, PDF-preview med markerade träffar.
Söket tolererar dessutom felstavningar i båda riktningar — användaren och dokumentet kan ha fel, träffen hittas ändå.
Arkitekturen mognade i realtid.
Spåret "kanske egen tjänst?" (dag 4) → "samlingstjänst beslutat" (dag 5) → "applikationstjänster vs plattformstjänster" som generell princip (Insikt 02) är ett tydligt exempel på hur sprinten producerade lärdomar utöver produkten själv.
Det breda governance-arbetet — kanonisk modell, schema registry, BFF-lager — pekades ut men lämnades öppet.
AI användes på två nivåer.
Dels i utvecklingen (Claude för riskanalys av befintlig mikrotjänst dag 2; shadcn valdes delvis för att AI genererar bra kod mot det). Dels i produkten (MCP-servern som låter AI söka över dokumentbeståndet med användarkontext).
Sprinten lever som den lär — det är konsekvent med insikten att shadcn ger lägre friktion mot AI-verktyg.
Saker som lyftes men aldrig landade.
Dessa har omnämnts i dagboken — ibland med tydligt mandat, ibland som passerande noteringar — men har lämnats hängande efter dag 10. Värt att se sanningen i vitögat innan uppskalningen.
WOPI-protokollet för dokumentredigering
Identifierat dag 2 som "stark kandidat", utlovat som infrastrukturspår vecka 2 på dag 5, omnämnt som "kommande" dag 7. Aldrig påbörjat under sprinten såvitt dagboken visar.
Cagris parallellspår för AI-stödd utveckling
Startades dag 3 med formuleringen "Cagri påbörjar det arbetet". Dyker aldrig upp igen i sprintdagboken. Oklart vad som hände.
DB↔S3-kopplingen långsiktigt
Identifierad dag 3 som "nyckelrisk att bevaka". Dag 4 stod på agendan att skissa på hur kopplingen bevakas långsiktigt. Ingen tydlig uppföljning syns i efterföljande dagar.
Datastyrningslagret mot Metakatalogen
Dag 3 fördes en mogen diskussion om semantic drift med konkreta lösningsförslag — kanonisk datamodell, BFF-lager, event-kontrakt med schema-register. Beslutet om samlingstjänst (dag 5) adresserar bara en del. Bredare governance kvarstår.
Fri namnsökning mot Metakatalogen
Beskriven dag 5 som "nästa steg" för att tilldela ansvar utan att behöva känna till exakt username. Status oklar — ingen tydlig leverans senare i sprinten.
Produktion på standups
Dag 6 insikt: deltagare från produktion behöver vara med — minimum på standups — för input vid tekniska val som påverkar IT-infrastruktur. Står som insikt men det framgår inte att rytmen faktiskt justerades.
Verksamhetens önskan att börja testa parallellt
Lyftes uttryckligen dag 6 — Vård och omsorg samt Individ och arbetsmarknad ville komma in och testa. Inget om hur det hanterades under resten av sprinten.
Styra dokument vid utgångsdatum
Önskemål direkt från verksamheten i slutdemon, "tekniskt inget problem" — men outfört och utan tydlig hemvist framåt.
Vad som hanns med — och vad som inte hann med
27 av 60 funktioner levererades under sprinten (45 %). Söket är komplett (7/7), dokumenthanteringen i stort sett klar (7/9) och administrationen är på plats (5/7). Resterande funktionalitet — främst dokumentlivscykeln bortom status, AI-funktioner bortom sök, integrationer och hela e-arkivexporten — är värd att medvetandegöra inför uppskalningen:
Vad teamet tar med sig.
Pilotinitiativet utforskade ett nytt arbetssätt — inte bara en produkt. Retrospektivet kondenserar erfarenheten till tre dimensioner: faktorer som bar sprinten, förutsättningar som måste finnas på plats, och risker som måste hanteras innan formatet skalas upp. Hela genomgången finns på fliken Retrospektiv.
Framgångsfaktorer som bar sprinten.
Fysisk samlokalisering och miljöombyte var avgörande — fullt fokus, realtidsdialog, tydligare brytpunkt vid avslut. Full-stack-arbete utan överlämningar eliminerade väntetiden mellan team. Insyn i andras domäner, delat ansvar och distribuerat arkitekturansvar gjorde teamet både snabbare och klokare.
Frihet i tekniska val gav utrymme att hitta de bästa lösningarna för uppgiften — men måste balanseras mot risken för teknisk skuld.
Förutsättningar som inte kan kompromissas bort.
Innan formatet återanvänds måste fem saker vara på plats: en tydlig målbild för sprinten (vad ska byggas, vad ska läras), deltagare från produktion minst på standups, 100 % rådighet över utvecklings- och testmiljöer, publik dokumentation och dagbok som verktyg både utåt och inåt, samt AI-stöd för daglig sammanfattning.
AI som dagboksskrivare är dessutom en viktig input till den kommande standardiseringen av AI-utveckling inom koncernen.
Risker att aktivt hantera.
Kognitiv belastning — arbetsformen är intensiv och man kan inte gå direkt från ett tigerteam till nästa. Teknisk skuld och förvaltningstyngd — tekniska val som anpassas i varje sprint riskerar att bli ett tungt arv om insikterna inte systematiskt förs in i ordinarie struktur.
Förväntningsraketen — när det händer mycket snabbt från start byggs det lätt upp orimliga förväntningar på att samma takt ska hållas kontinuerligt. Behöver hanteras kommunikativt.
Det sprinten lämnar efter sig.
Sammanställt från sprintdagboken, insiktsfliken och slutdemons synpunkter — organiserat i fyra horisonter: omedelbart, tekniskt, strategiskt och process.
Direkta uppföljningar
Vecka efter slutdemonRetrospektiv genomfört
Sex framgångsfaktorer, fem förutsättningar och tre risker att hantera är dokumenterade. Se fliken Retrospektiv för fullständig sammanställning.
Beslut om uppskalning
Bereds enligt slutdemon. Vård och omsorg samt Individ och arbetsmarknad är de naturliga första testpiloterna.
Owner · Jari & MariaPelle skriver arkitekturbeskrivning på Confluence
Action under Insikt 02 — formalisera mönstret som skiljer applikationstjänster från plattformstjänster.
Owner · PelleTekniska spår
Närmaste sprintarWOPI-integration
Office-redigering direkt från detaljsidan. Skissad dag 7 men aldrig påbörjad i sprinten.
Fri namn-/e-post-/användarnamnssökning
Mot Metakatalogens sök-endpoint för att tilldela ansvar utan att behöva känna till exakt username.
Djupare Public 360-integration
När den enkla ärendenummer/beslutslänken är verifierad i drift kan djupare dataflöde utvärderas.
Utbyggnad av attention-modulen
Fler signaltyper — saknade metadatafält, gamla revisioner, försenad granskning.
Styra dokument vid utgångsdatum
Önskemål från slutdemon — möjlighet att definiera vad som händer när giltighetstiden löper ut. "Tekniskt inget problem".
Förvaltningsvy ovanpå användningsstatistiken
Förvaltningsansvariga får överblick över all dokumentanvändning inom sin förvaltning.
Strategiska spår
Tas vidare i förvaltningUtvärdering av shadcn/ui-migration
Initiera utvärdering av migration eller komplettering med etablerat komponentbibliotek. Väg in tillgänglighet, AI-kodgenerering, underhållsbörda och migreringsarbete för befintliga applikationer.
Insikt 01Etablera arkitekturmönster
Skilj applikationstjänster (domänrik logik i sammanhållen tjänst) från plattformstjänster (generella, delade mikrotjänster). Tillämpa som standard för nya projekt och utvärdera om befintliga applikationer bör konsolideras.
Insikt 02Datastyrningslager mot Metakatalogen
Det bredare governance-arbetet kvarstår: kanonisk datamodell, BFF-/gateway-lager för fältnormalisering, event-kontrakt med schema-register, gemensam data dictionary.
Arbetssätt för nästa sprint
Process-förbättringSäkra produktionens deltagande på standups
När tekniska val kan påverka IT-infrastruktur. Insikt från dag 6 som inte tydligt landade under sprinten.
Bredare verksamhetsdeltagande under sprinten
Bedöm hur verksamheten kan komma in och testa parallellt med utvecklingen — lyftes dag 6 men inte stängt.
Hantera funktionslistan inför uppskalning
Resterande funktionalitet (33 av 60 funktioner) — e-arkivexport, granskningsflöde, läskvittens, prenumerationer, klarspråksversion, tillgänglighetsanalys, styrkedja, publikt API och inbäddningsbara widgets — behöver prioriteras och planeras in i kommande arbete.
Det starkaste mönstret i materialet är att sprinten levde efter sin egen metod. Det förklarar varför slutmottagandet blev så starkt och varför ett antal teknikspår hann lyftas men inte landa under just dessa två veckor — och retrospektivet pekar nu ut villkoren för att den metoden ska gå att återanvända.
Pilotinitiativets kvitto.
Innovationssprinten har genomförts som ett pilotinitiativ för att utforska nya arbetssätt. Retrospektivet visar genomgående positiva erfarenheter kring fokus, samarbete och leveranstakt — med ett antal tydliga framgångsfaktorer som bör tas vidare. Samtidigt identifieras risker som behöver hanteras innan arbetssättet skalas upp — framför allt kring kognitiv belastning, teknisk skuld och förväntningshantering.
Det som bar sprinten.
Sex faktorer som tillsammans skapade kraften — och som bör betraktas som villkor när formatet återanvänds.
Fysisk samlokalisering och miljöombyte
Att sitta fysiskt tillsammans, och dessutom på en annan plats än vanligt, har varit en av de mest avgörande faktorerna för sprintens framgång. På de ordinarie arbetsplatserna sker dagliga avbrott och täta kontextväxlingar, medan sprintformatet möjliggjorde fullt fokus på uppgiften. Det blev också möjligt att löpande bolla även svåra frågor och lösa dem tillsammans i realtid.
Miljöombytet har en stark psykologisk effekt — inte bara under sprinten, utan även vid avslut, då det skapar en tydligare brytpunkt och bättre context-switch inför nästa projekt. Fysisk närvaro bör betraktas som ett nästintill ovillkorligt krav för denna typ av sprint, även om enstaka avvikelser kan accepteras.
Full-stack-arbete utan överlämningar
Teamet arbetade brett över hela stacken och undvek de överlämningar mellan team som annars är vanliga i vardagen. I ordinarie verksamhet uppstår ofta väntetid där utvecklare i ett team står stilla i väntan på leverans från ett annat. Under sprinten tog deltagarna gemensamt ansvar för uppgifter över hela stacken och hjälptes åt — vilket eliminerade väntetiden och gav en kontinuerlig leveransrytm rakt igenom.
Insyn i andras domäner
Arbetsformen gav betydande mervärde genom att deltagare fick insyn i kollegors expertområden — exempelvis fick frontend-fokuserade utvecklare arbeta med och diskutera mikrotjänster. Detta skapade både större ömsesidig förståelse för olika perspektiv och en löpande kompetenshöjning i teamet.
Delat ansvar och öppen lärandekultur
Arbetssättet bidrog till att samtliga teammedlemmar kände starkt ansvar och hade "skin in the game". Detta var direkt kopplat till en öppen inställning till lärande, där deltagarna både gav varandra input och var mottagliga för feedback. Frånvaron av prestige och ett genomgående konstruktivt synsätt bedöms som ytterligare hårda krav för att arbetssättet ska fungera.
Frihet i tekniska val
Det har varit värdefullt att teamet fått ta stort ansvar för tekniska val, och att arkitektur och teknik inte varit fullständigt låsta i förväg. Flexibiliteten gjorde det möjligt att hitta de bästa lösningarna för uppgiften.
Distribuerat arkitekturansvar
En central insikt är att arkitekturfrågor med fördel hanteras av hela teamet snarare än av en central arkitekt. När alla i teamet tar eget ansvar för arkitekturen öppnas möjligheter att hitta nya vägar och föreslå förändringar som skapar mervärde — och teamet behöver ett stort mandat att navigera de här frågorna i realtid under sprinten, utan att fastna i remissrundor.
Lika viktigt är att insikter och eventuella förändringar som påverkar gällande riktlinjer fastställs av centrala arkitekter efter sprinten. Annars stannar lärdomarna i det enskilda projektet och blir aldrig till generella mönster för organisationen — vilket både gör att andra team inte får ta del av nyttan och att den tekniska skulden växer när varje ny sprint hittar på sina egna lösningar (jämför risk R2). Sprinten genererar — det centrala arkitektarbetet ratificerar och sprider.
Det som måste finnas på plats.
Fem strukturella förutsättningar som inte kan kompromissas bort när formatet återanvänds.
Tydlig målbild för sprinten
En gemensam, tydlig och välkommunicerad målbild är avgörande: vad vill vi åstadkomma och vad vill vi lära oss? Det kommer finnas olika typer av innovationssprintar — exempelvis sprintar som handlar om att utforska tekniska förutsättningar för att öka utvecklingstakten kring en befintlig applikation, och sprintar som handlar om att innovera helt nya tjänster som idag saknas i koncernen. Olika typer av sprintar kräver olika upplägg, vilket gör målbilden ännu viktigare.
Deltagare från produktion
Det är viktigt att ha med en deltagare från produktion. Personen behöver inte nödvändigtvis vara involverad till 100 % som övriga teammedlemmar, men bör delta på dagliga standups och liknande forum.
Rådighet över utvecklings- och testmiljöer
Teamet behöver 100 % rådighet i alla led — från utveckling till deploy. Detta förutsätter utvecklings- och testmiljöer där teamet har full rådighet och kan agera utan externa beroenden. I dagens utvecklingsprocesser finns ofta stora beroenden till produktion, som sällan har resurser för att möta utvecklingsbehoven och därmed lätt blir en flaskhals. När en sådan flaskhals uppstår bidrar den direkt till lägre tempo och i förlängningen till väsentligt dyrare utveckling.
Publik dokumentation och dagbok
Publik dokumentation och process dag för dag skapar både transparens utåt och fungerar som ett viktigt verktyg för teamet självt — i en vardag där mycket händer varje dag är en löpande dagbok ovärderlig för att hålla koll.
AI-stöd för daglig sammanfattning
Att använda arbetssätt där AI sammanfattar varje dags aktiviteter som en form av utvecklardagbok visade sig värdefullt. Det blev tydligt enklare att återuppta arbetet dagen efter utan att tappa tråd eller missa detaljer. Detta är en viktig input till den kommande standardiseringen av AI-utveckling inom koncernen.
Det som kan välta formatet.
Tre risker att aktivt hantera för att inte bygga in problem i nästa sprint.
Kognitiv belastning
Arbetsformen är intensiv och man kan inte gå direkt från ett tigerteam till nästa. Den kognitiva belastningen måste vägas in i prioriteringen och bemanningen av kommande sprintar.
Teknisk skuld och förvaltningstyngd
Allt för stora möjligheter att anpassa tekniska val i varje enskild sprint riskerar att skapa ett tekniskt arv som blir tungt att förvalta. Det är viktigt att nya insikter från sprintarna systematiskt fångas upp och förs in i ordinarie struktur, så att vi inte tvingas hitta på nya mönster i varje sprint.
Förväntningsraketen
När det händer mycket snabbt från start uppstår en stigande förväntan från verksamheten. Det är viktigt att aktivt arbeta kommunikativt med förväntningshantering, så att det inte byggs upp orimliga förväntningar på att samma höga takt ska kunna hållas kontinuerligt — något som i sig riskerar att bli en börda för de team som arbetar i olika sprintar.
Innovationssprinten bekräftar att fysisk samlokalisering, full-stack-samarbete utan överlämningar, distribuerat ansvar och en öppen lärandekultur tillsammans skapar en kraftfull arbetsform. För att kunna återanvända och skala formatet behöver vi säkerställa tydliga målbilder, rådighet över utvecklings- och testmiljöer, deltagande från produktion samt aktivt hantera de identifierade riskerna kring belastning, teknisk skuld och förväntningar.