Dokumentationen / Modul
utvecklingsarende
dok · utvecklingsarendeid: utvecklingsarende
namn: utvecklingsarende
sammanfattning: Beslutsunderlag för utvecklingsinitiativ: fjorton avsnitt enligt kommunens mall, där fyra är typade radlistor med summeringar i stället för fritext.
uppdaterad: 2026-09-04
ansvar:
- Äga datakontraktet för ett utvecklingsärende: fjorton avsnitt, sju avsnittstyper, inga fria strängar där en union räcker.
- Hålla beräkningarna som rena funktioner, så att vyn och servern får samma summor.
- Härleda kostnadsraderna ur resursbehovet, så att dokumentet inte säger två olika saker om samma sak.
- Äga fokusrutten /flode/utvecklingsarende och hela vyn bakom den.
- Bidra med rader i "Att agera på" för underlag som väntar på granskning eller beslut.
- Aldrig lämna ett ärende för beslut själv – servern avgör.
filer:
- modules/utvecklingsarende/src/data/types.ts — Datakontraktet: avsnittstyper, radtyper, Material, Utvecklingsarende.
- modules/utvecklingsarende/src/data/mock.ts — Exempelärendet ur designfacit. Siffrorna är facit för berakning.test.ts.
- modules/utvecklingsarende/src/data/index.ts — hamtaUtvecklingsarenden(ctx) – enda ingången till datat.
- modules/utvecklingsarende/src/berakning.ts — summorKostnader, summorNyttor, summorResurser, synkaHarledda.
- modules/utvecklingsarende/src/manifest.ts — routes med mode focus, nav, slots.actions och ai.intents.
- modules/utvecklingsarende/src/components/UtvecklingsarendeFlode.tsx — Fyra steg i en vy. Stegraden ritas här, inte i skalets FlowBar.
- modules/utvecklingsarende/src/components/Underlag.tsx — Steg 1: fälten och uppladdningen med sina gränser.
- modules/utvecklingsarende/src/components/Avsnittskort.tsx — Steg 3: ett avsnitt som kort, med rätt editor för sin typ.
- modules/utvecklingsarende/src/components/Assistent.tsx — Samtalet om det avsnitt användaren står i. Flödets enda AI-yta.
- modules/utvecklingsarende/src/components/Forhandsvisning.tsx — Steg 4: mallens form. Ren presentationskomponent utan state.
- modules/utvecklingsarende/src/components/Kontrollista.tsx — Steg 4: status per rubrik, bekräftelsedialog och inlämning.
- modules/utvecklingsarende/src/store.ts — Zustand: steg, ärende, samtal och anropen mot serverändarna.
- modules/utvecklingsarende/src/flow.ts — MALL som DokumentflodeDefinition, KARNAVSNITT, luckor och farLamnas.
- modules/utvecklingsarende/src/schema.ts — Utkast- och turschema byggda ur MALL, plus byggAvsnitt.
- modules/utvecklingsarende/src/prompt.ts — Systemprompten ur definitionen. Serverns summor följer med turprompten.
- modules/utvecklingsarende/src/motor/mock.ts — Regelmotorn bakom AI_PROVIDER=mock. Samma kontrakt som modellen.
- modules/utvecklingsarende/src/flode.ts — Serversidans ingång: definition, prompt, schema och motor utan vyn.
- modules/utvecklingsarende/test/berakning.test.ts — 11 tester på summorna och härledningen.
- modules/utvecklingsarende/test/flow.test.ts — 28 tester på mallen, luckorna, farLamnas och schemat.
- modules/utvecklingsarende/test/motor.test.ts — 18 tester på regelmotorn.
- modules/utvecklingsarende/test/store.test.ts — 7 tester på redigeringarna, bland annat att en ändrad timkostnad räknar om Kostnader direkt.
api:
- hamtaUtvecklingsarenden: (ctx: UserContext) => Promise<UtvecklingsarendeSvar>
Rollfiltrerade underlag. Mockade – det finns ingen lagring förrän fas 4.
- summorKostnader / summorNyttor / summorResurser: (avsnitt) => summor
Rena funktioner över datakontraktet. Treårsfönstret är mallens.
- synkaHarledda: (kostnader, resurser) => Kostnadsrad[]
Räknar om de kostnadsrader som bär harleddFran ur resursbehovet.
- MALL: DokumentflodeDefinition
Flödet som data. Prompt, schema och förhandsvisning genereras ur den.
- farLamnas: (arende, modellenForeslar, anvandarenHarBekraftat) => boolean
Serverns beslut. Tre villkor samtidigt; modellens förslag räcker aldrig.
- utkastSchema / turSchema: () => ZodObject
Structured outputs-kontraktet, byggt ur MALL i stället för skrivet för hand.
- parsaArende: (varde: unknown) => Utvecklingsarende | null
Validerar dokumentet klienten skickar. Enda stället formen konverteras.
- koraTur / spelaUppUtkast: regelmotorn
Deterministisk tur för offline-demo. Samma kontrakt som modellen.
- useUtvecklingsarende: zustand store
Flödets tillstånd i klienten. Ingen prompt och ingen nyckel bor här.
kontrakt:
- Ett avsnittsvärde är ett objekt eller en radlista, aldrig en sträng. Därför passar det inte i FlowDefinition (ADR-015).
- Avsnittsstatus är tom, utkast, granskad eller last. Allt som står som utkast bär AiChip tills användaren granskat det.
- Nettonyttan är tre års nytta minus tre års kostnad: engångskostnaden en gång, den löpande tre.
- Kostnadsrader med harleddFran ägs av resursbehovet och skrivs aldrig för hand.
- Actions-raden kommer ur datafunktionen och visar mockade underlag. Utkastet som står öppet i en flik känner servern inte till.
- Allt modellen skrivit bär AiChip tills användaren markerat avsnittet som granskat, och märket följer med in i förhandsvisningen och inlämningen.
beroenden: module-sdk, ui, api-mock, api-utvecklingsarende, agera
beslut: ADR-015, ADR-006
kvarstår:
- Ingen lagring: ärendet lever i klientens store under sessionen och nollställs när flödet öppnas. Spara utkast finns inte, och verkliga utkast i actions-raden kräver fas 4.
- Förslagschipet ger AI-fältets knapp till flödet, men flödet läser inte frågan som följer med (?fraga=) än.
- Word-export hör hemma i BFF:en. Knappen finns men är avstängd.
- Beslutsavsnittet fylls av beslutsfattaren – den vyn finns inte.
- Utkastet tar drygt en minut mot modellen och skrivs i ett anrop. Steg 2 visar väntetiden, inte ett påhittat förlopp – och avbryts av sig självt efter tre minuter.