Domenemodell⚓︎
Tre views av samme modell, alle avgrenset til Enova.Kai.Domain pluss de to policyene i
Enova.Kai.Application som bærer ekte domeneregler. Ingen infrastruktur, ingen hosts — det
bildet ligger i Runtime-arkitektur.
Språket er hentet fra CONTEXT.md og ADR-015:
domenebegreper på norsk med æøå, teknisk stillas på engelsk.
Aggregater og verdiobjekter⚓︎
Tre ting er verdt å merke seg:
- Bare
Sak,RegelogRegelresultater aggregatrøtter — de arverAggregate<TId>.Beslutning,Stadiegjennomgang,RegelGjennomgang,Arbeidsmarkering,ErsStatus,Søknadskostnad,VirkemiddelMasterdataogVurderinger vanlige entiteter uten egen rot. - Invariantene er ujevnt fordelt.
Regelresultat.Create()avviser et resultat uten regelutfall og krever facts-hash, schema- og engine-versjon.Sakhar ingen invarianter:FraReplika/OppdaterFraReplikakopierer felter, ogOppdaterProjeksjonsetter de utledede kolonnene. - Domain events driver sak-projeksjonen.
SakStatusEndret,RegelresultatOpprettet,BeslutningRegistrertogStadiegjennomgangEndretarverDomainEvent, reises medAggregate.Raise()og plukkes opp avDomainEventDispatchingInterceptorvedSaveChanges. Håndtererne iEnova.Kai.Application/Cases/Projection/skriver de utledede kolonnene påSak, slik atGET /casesslipper å regne dem ut per kall — se ADR-021.
Hvem eier hvilke begreper⚓︎
Skillet som forklarer mest i modellen er hva Kai eier og hva Kai bare låner:
Sak,ErsStatus,Vurdering,VirkemiddelMasterdataogSøknadskostnader ERS sine begreper. Kai holder en replika, leser den fra Mimir gold, og skriver aldri tilbake. Det er grunnen til atSaker en ren projeksjon uten oppførsel.Regelresultat,Beslutning, gjennomgang-entitetene og regel-/workflow-config finnes ikke oppstrøms. De oppstår i Kai og har ingen annen kilde.- Alle gold-kall går gjennom kilde-adaptere som oversetter gold-skjema til domenetyper, slik at kolonnenavn fra gold ikke lekker inn i modellen. Se Kildesystemer.
Fra sak i gold til beslutning⚓︎
Hvert steg i Kai-lanen er en egen TickerQ-jobb i kai-worker. Saksbehandleren er eneste kilde
til beslutning; alt annet i historien er systemgenerert.
To ting historien ikke viser
- Dokumenter som gir opp. Et dokument som feiler permanent etter retries blir ikke stille borte — det varsles på regelresultatet. Steget er utelatt fordi en egen avviks-lane gjorde diagrammet for høyt for å være lesbart på én skjerm.
- Ny kjøring etter beslutning. En
Beslutningoverstyrer ett regelutfall, og resultatet regnes på nytt. Sløyfen tilbake til regelkjøringen er utelatt fordi en backward edge tvang ruter på kryss av lanene.
Slik oppdaterer du diagrammene⚓︎
Alle tre genereres fra typede specs i docs/sourcefiles/arkitektur/ — ikke rediger HTML-filene
direkte.
| Diagram | Spec | Type |
|---|---|---|
| Aggregater | kai-domenemodell.arch.json |
architecture |
| Eierskap | kai-kontekstkart.arch.json |
architecture |
| Historie | kai-domenehistorie.workflow.json |
workflow |
| Bash | |
|---|---|
Merk at architecture- og workflow-typene ikke har egne node-typer for aggregat, entitet
eller verdiobjekt. Taksonomien ligger i meta.legend-etiketter og per-node tag, altså en
konvensjon — ikke noe skjemaet håndhever. Endrer du hva en form betyr, må legenden endres i
samme slengen.