dynamisk-rettsstat/README.md
Kjell Tore Guttormsen 24996d66bd
docs: mark the work as finished
README and BIDRA.md state that the work is finished and that no new
versions are planned; 0.1.2 is the last version. CHANGELOG has an entry
without a version. The plugin itself (skills, model, core, reference
output) is unchanged, so there is no new tag or release.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 20:57:46 +01:00

243 lines
14 KiB
Markdown

# dynamisk-rettsstat
Plugin for Claude som kjører modellen i Den dynamiske rettsstaten på egne tall: finn leddet som binder, følg tiltaket over tid, simuler egne scenarioer og endre modellen.
Notatet *Den dynamiske rettsstaten* har en modell av straffesakskjeden: hvor den binder, hva slags tiltak det krever,
og hva som skjer over tid. Med denne pluginen kan du bruke modellen ved å snakke med Claude, uten å programmere: legg
inn tall per ledd, eller spør «hva om …», og få svaret med modellens egne tall og forbehold. Den er laget for dem som
arbeider i straffesakskjeden og for forskere som vil prøve, etterprøve eller forbedre modellen.
Prinsippet bak notatet: «Innsatsen for å håndheve lover og regler bør løpende stå i forhold til hvor mye, og hvor
alvorlig, de faktisk brytes.» Straffebud og strafferammer ligger fast.
**Status:** Arbeidet er avsluttet (november 2026), og det er ikke planlagt nye versjoner. Versjon 0.1.2 er den siste.
Pluginen kan brukes og bygges videre på fritt etter lisensen. Innspill og rettelser kan fortsatt sendes på e-post, se
[Slik er arbeidet gjort](#slik-er-arbeidet-gjort).
## Install
I Claude Code:
```bash
claude plugin marketplace add https://git.fromaitochitta.com/open/ktg-plugin-marketplace.git
claude plugin install dynamisk-rettsstat@ktg-plugin-marketplace
```
I Claude Cowork: last ned zip-fila for nyeste utgivelse fra
[utgivelsessiden](https://git.fromaitochitta.com/open/dynamisk-rettsstat/releases) og last den opp som plugin. Cowork
tar zip-fila slik den er.
Det som trengs:
- **Python 3.** Flaskehalsdiagnosen trenger ikke noe mer.
- **numpy og scipy** for forløpet over tid, simuleringene og kontrollen. Mangler de, spør Claude før noe installeres,
og installerer dem da fra PyPI i en egen mappe for pluginen (krever internett). Ingenting installeres uten at du
sier ja. I Cowork fantes begge fra før da pluginen ble prøvd, så ingenting ble installert.
Status: prøvd i Claude Code og i Cowork. Hva som er målt i Cowork, og hva som ikke er det, står under «Prøvd i
Cowork» lenger ned.
## Hva du kan gjøre med den
Pluginen har fire ferdigheter. Du trenger ikke kunne navnene: si hva du vil, så velger Claude riktig ferdighet.
Eksemplene under er virkelige svar fra pluginen, kortet ned.
### Finn leddet som binder (`diagnose`)
Du sier: *«Finn flaskehalsen i straffesakskjeden. Her er tallene våre for saker inn, kapasitet og restanse per ledd.»*
Claude spør etter det som mangler, viser tallene slik de er forstått, og regner når du har sagt ja. Med eksempeltallene:
```
Ledd Utnyttelse Saksbeh.tid Mål Restansevekst/mnd
Politi 0,86 1,7 2,0 0
Påtale 0,88 1,2 1,5 0
Domstol 1,28 5,6 3,0 29
Kriminalomsorg 0,90 1,5 2,0 0
Skranken som binder: Domstol (utnyttelse 1,28, restanse 589 mot mål 316; vekst: innstrømning minus kapasitet).
...
Kapasitet: (0,80 x 134,3 + 273/24) / 0,95 = 125,1 saker/mnd, det vil si 19 % mer.
```
Svaret har tiltakene i rekkefølgen utnytt leddet, led saker utenom, utvid, etter *Theory of Constraints*.
### Følg tiltaket over tid (`forlop`)
Du sier: *«Hva skjer måned for måned hvis vi følger anbefalingen? Tåler styringen forsinkelsen?»* Med samme tall:
```
Kritisk forsinkelse: 7,2 mnd. Forsinkelsen er kortere, så styringen er stabil (margin 4,2 mnd).
...
- nå: bestill 19 % mer kapasitet
- om 12 mnd: bestill 12 % mer kapasitet
```
Deretter en tabell med kapasitet, andel ledet utenom, restanse, saksbehandlingstid, politiinnsats, kriminalitet og
tillit, med og uten tiltak, og hva det betyr for leddene etter.
### Kjør modellen med egne forutsetninger (`simuler`)
Du sier: *«Hva om restansen avvikles over 6, 12, 24 eller 48 måneder i stedet for 24 i den koordinerte regelen?»*
Claude beskriver scenarioet med ord, kjører det når du har sagt ja, og viser nøkkeltallene. Utdrag:
```
| Nøkkeltall | T_clear=6 | T_clear=12 | T_clear=24 | T_clear=48 | T_clear=96 | T_clear=inf |
|-----------------------------------------------------------|----------:|-----------:|-----------:|-----------:|-----------:|------------:|
| Kriminalitet K, gjennomsnitt fra mnd 12 | 1,093 | 1,096 | 1,098 | 1,102 | 1,111 | 1,128 |
| Saksbehandlingstid i domstolen, lengste (mnd) | 8,0 | 8,1 | 8,3 | 8,5 | 8,6 | 8,8 |
| Kapasitet, høyeste (1,00 = ved start) | 1,91 | 1,53 | 1,31 | 1,19 | 1,10 | 1,07 |
| Kapasitetsår over utgangsnivået | 6,28 | 4,66 | 3,52 | 2,22 | 1,21 | 0,88 |
```
Parameterne er notatets stiliserte verdier, og tallene viser modellens dynamikk, ikke prognoser; det står i hvert
svar. Hver kjøring skriver et sammendrag, tidsseriene som CSV og alle parametere slik de ble brukt. Claude tilbyr en
figur laget av de samme tallene. Pluginen har seks ferdige scenarioer, og 21 scenariofiler som lager notatets
figurgrunnlag på nytt.
### Forbedre modellen (`forbedre`)
Du sier: *«Jeg vil legge til en mekanisme i modellen»* eller *«Jeg vil endre en ligning og se hva det gjør med
notatets resultater.»* Claude lager en kopi av modellen som du eier, finner ligningen i modellkartet, gjør endringen
sammen med deg og kjører kontrollen. Uendret modell gir `Nivå: bit for bit som notatet.` Her er kjernen i en kopi
endret slik at frafallet fra domstolskøen er 0,02 i stedet for 0,01 per måned:
```
1. Kjernen: endret fra notatet (https://git.fromaitochitta.com/open/den-dynamiske-rettsstaten @ 2badc25): sim.py er endret.
1. Fasit: uendret fra notatet (27 filer).
...
4. Full kjøring: 11 av 22 datafiler like byte for byte med notatet; utskriften endret.
kjede_s2.dat (endret): største absolutte avvik per kolonne: K 9,5e-03, U 2,8e-03, L 8,4e-03, T 2,8e-02, Q 1,8e+00, tauD 1,7e+01
...
6. Scenariokjøreren: 6 av 14 av notatets datafiler gjenskapt byte for byte fra eksempler/scenarioer/notatet/.
...
Nivå: endret: Kjernen, forlop, Full kjøring, Scenariokjøreren.
Dette er en arbeidskopi, så det er en opplysning, ikke en feil: detaljene over viser hvilke av notatets resultater som har flyttet seg, og hvor mye.
```
## Prøv uten egne tall
To eksempelfiler følger med. Si for eksempel *«Prøv flaskehalsdiagnosen på eksempeltallene»*:
- **Stiliserte tall** (`eksempler/eksempel_domstol.json`): modellens egne tall, ikke norske. Domstolen binder, og
svaret gjenskaper avsnitt 9.5 i notatet: utnyttelse 1,28 og 19 % mer kapasitet.
- **Offentlige norske tall for 2025** (`eksempler/norge_2025.json`): politi og påtale 1,09, tingrett 1,04,
lagmannsrett 0,88 og fengsel 1,09. Flere av tallene er anslag, og kildene står i fila. Forbeholdene står i
[docs/forbehold.md](docs/forbehold.md).
## Forholdet til notatet
Notatet, simuleringskoden og PDF-ene ligger i
[den-dynamiske-rettsstaten](https://git.fromaitochitta.com/open/den-dynamiske-rettsstaten).
- Kjernen i `modell/kjerne/` er uendrede kopier av notatets `sim.py`, `diagnose.py` og `forlop.py` ved commit 2badc25,
låst med sha256 i `modell/kjerne/KILDE.json`. En test feiler hvis en av dem endres.
- Kontrollen måler kjernen og fasiten mot notatets egne sjekksummer, kjører hele notatets simulering og
sammenligner med notatets 22 datafiler og utskriftene, og kjører notatets scenariofiler gjennom scenariokjøreren.
Målt 2026-11-11 med Python 3.14.0, numpy 2.5.4 og scipy 1.18.1 (macOS): alle 22 datafilene er like byte for byte,
og 14 av 14 scenariofiler gjenskaper notatets datafiler byte for byte. Samme dag i Cowork med Python 3.13.18,
numpy 2.5.3 og scipy 1.18.1 (Linux): samme resultat. Med andre versjoner av numpy og scipy sier kontrollen om
tallene er like bit for bit eller innenfor én enhet i siste siffer.
- Scenariokjøreren kaller kjernen uendret. Scenariofilene i `eksempler/scenarioer/notatet/` gjenskaper notatets
datafiler, og testene sammenligner dem med fasiten.
Du kan sjekke dette selv. Kontrollen tar et par minutter, testene noen minutter til:
```bash
git clone https://git.fromaitochitta.com/open/dynamisk-rettsstat.git
cd dynamisk-rettsstat
python3 -m venv .venv
.venv/bin/pip install --group dev
.venv/bin/python modell/kjor.py kontroll
.venv/bin/python -m pytest
```
Kontrollen skal ende med `Nivå: bit for bit som notatet.` når Python, numpy og scipy er versjonene over. Med andre
versjoner kan den ende med `Nivå: innenfor toleranse`; det er ikke sett i noen av målingene. `kontroll --alt` viser
alle linjene som er ulike, ikke bare de 40 første per sammenligning. `pip install --group dev` trenger pip 25.1
eller nyere.
## Forbedre modellen selv
Modellen er en første versjon, og notatet er skrevet som en invitasjon til videre arbeid. Pluginen er bygd for at du
skal kunne endre den:
- **Arbeidskopi.** Endringer gjøres i en kopi av modellen i din egen mappe (`rettsstat-modell/`), ikke i pluginen,
som byttes ut når den oppdateres. Finnes en kopi i mappa du jobber i, spør Claude om den skal brukes, og sier hva
kontrollen sier om den før tallene legges fram.
- **Modellkart.** [docs/modellkart.md](docs/modellkart.md) går fra notatets ligninger til funksjonene og
parameterne i koden, med status for hver ligning.
- **Utvidelser med grensetilfelle.** En ny mekanisme legges ved siden av kjernen, med en verdi der den forsvinner og
modellen gir nøyaktig kjernens tall. Regelen er notatets egen. Mal og et gjennomført eksempel står i
[docs/utvidelser.md](docs/utvidelser.md).
- **Kontrollen** sier etter hver endring om notatets resultater står fast, eller hvilke som har flyttet seg og hvor
mye.
Forskere som bruker git, kan også klone dette repositoryet og starte Claude Code med `claude --plugin-dir .` i mappa.
Slik sender du en forbedring tilbake: [BIDRA.md](BIDRA.md).
## Prøvd i Cowork
Forfatteren prøvde v0.1.0 i Cowork i Claude-skrivebordsappen 2026-11-11. Dette ble målt:
- **Installasjon.** Zip-fila for v0.1.0 fra Forgejo ble lastet opp uten advarsler, og de fire ferdighetene var på
plass.
- **Diagnosen** ga tallene som står i dette dokumentet, på eksempeltallene (1,28 og 19 %), på de norske tallene
(1,09 / 1,04 / 0,88 / 1,09) og på egne tall oppgitt per år. Claude delte årstallene på 12, viste tallene slik de
var forstått, og spurte før regningen.
- **Forløpet** ga 7,2 måneder, 19 % nå og 12 % om 12 måneder, også i en ny økt.
- **Kontrollen** endte med `Nivå: bit for bit som notatet.`: 22 av 22 datafiler og 14 av 14 scenariofiler.
- **Miljøet.** Cowork kjørte kommandoene i en Linux-maskin (Ubuntu 24.04) der Python 3.13.18, numpy 2.5.3 og scipy
1.18.1 fantes fra før. Pluginen installerte derfor ingenting.
- **Arbeidskopi.** En kopi med frafallet fra domstolskøen satt til 0,02 ga `Nivå: endret`, med 11 av 22 datafiler
flyttet. Kopien ble laget i Linux-maskinen, og Claude ga den tilbake som en zip-fil sammen med kontrollutskriften.
Ikke målt i Cowork:
- En egen simulering fra «hva om …» til tabell og figur. Prøven stoppet ved spørsmålet Claude stilte før kjøringen.
Scenariokjøreren selv ble kjørt av kontrollen.
- Installasjon av numpy og scipy fra pluginen, siden de fantes fra før.
- Om en arbeidskopi blir liggende til neste økt.
Windows er ikke prøvd, verken i Cowork eller i Claude Code.
## Status og begrensninger
- Modellen er ikke kalibrert på norske data. Parameterne er stiliserte, og simuleringene illustrerer mekanismer. De
er ikke prognoser.
- Av notatets 39 nummererte ligninger er 18 implementert, 12 forenklet og 9 ikke implementert.
- Bare ett ledd har kø i modellen. Alle simuleringene antar feilfrie observasjoner, og resultatene er enkeltbaner
uten parameterusikkerhet.
- I modellene med kø i domstolen er utgangspunktet nesten, men ikke helt, en likevekt: uten noe sjokk går
kriminaliteten fra 1,000 til 1,018 og saksbehandlingstiden fra 3,0 til 4,6 måneder over 240 måneder. Notatet
omtaler det under begrensningene i avsnitt 10. En liten del av det kjedescenarioene viser, er denne driften, og
sammendraget viser hvor langt den har kommet fram til sjokket.
- Kostnader og gevinster er ikke regnet i kroner.
- Svarene er tekst og tabeller, med tilbud om en figur etter en simulering. Pluginen bruker ikke det Cowork ellers
kan av visuelle svar. Det er en opplagt videreutvikling for den som vil bygge videre på den.
- Diagnosen regner på tallene slik de er oppgitt, og kapasitetsbehovet er et grovt anslag.
Alle forbeholdene, for modellen, diagnosen, forløpet og de norske tallene: [docs/forbehold.md](docs/forbehold.md).
## Non-goals
- Ingen prognoser. Kjøringene viser modellens dynamikk.
- Erstatter ikke budsjettarbeidet. Den viser hvor kjeden binder, hvilken type tiltak som følger, og omtrent hvor
stort tiltaket bør være.
- Sier ingenting om enkeltsaker eller enkeltpersoner, og skal bare brukes på aggregerte tall.
- Ingen persondata og ingen data fra enkeltsaker, verken i pluginen eller i det den skal brukes på.
- Kalibrerer ikke modellen mot norske tidsserier.
- Foreslår ikke å endre straffebud eller strafferammer.
## Slik er arbeidet gjort
Arbeidet er et privat eksperiment. Modellen, koden og denne pluginen er i praksis laget av kunstig intelligens
(Claude, Anthropic) etter forfatterens retning. Forfatteren har ikke selv etterprøvd all matematikken, og det kan være
feil og mangler. Forfatteren har ansvaret for innholdet.
Innspill og kritikk er velkomne, særlig fra dem som arbeider i straffesakskjeden og fra forskere som vil prøve
modellen mot data. Send en e-post til hello@fromaitochitta.com.
## Lisens
[MIT](LICENSE).
## Changelog
See [CHANGELOG.md](CHANGELOG.md).