docs: bring skills and docs in line with the fixed code
Skills ask before using a working copy found in the user's folder and state its check level first. The drift of the queue models before the shock is stated in the caveats and the README. README shows how to run the check and the tests. The drift line names the month a gradual drive begins. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
This commit is contained in:
parent
776325c680
commit
c641ea9e80
13 changed files with 314 additions and 113 deletions
12
BIDRA.md
12
BIDRA.md
|
|
@ -17,7 +17,9 @@ Send:
|
|||
(`git init`, `git add -A`, `git commit -m "utgangspunkt"`) og lage patchen med `git format-patch -1` etter at
|
||||
endringen er committet. Uten git: send filene du har endret eller lagt til, med stien i kopien.
|
||||
2. **Utskriften fra kontrollen** på modellen med endringen:
|
||||
`python3 modell/kjor.py kontroll` i arbeidskopien eller klonen (den fulle, ikke `--rask`).
|
||||
`python3 modell/kjor.py kontroll` i arbeidskopien eller klonen (den fulle, ikke `--rask`, og med numpy og scipy,
|
||||
så alle seks delene er kjørt). Kontrollen måler mot notatets egne sjekksummer, som står fast i
|
||||
`modell/kontroll.py`; endre ikke den fila eller `fasit/`.
|
||||
3. **Scenariofilene** som viser hva endringen gjør, og gjerne sammendragene kjøringene skrev.
|
||||
4. **En kort forklaring**: hva endringen gjør, hvorfor (hypotesen, gjerne med kilde), og hva kjøringene viser.
|
||||
|
||||
|
|
@ -27,10 +29,12 @@ Send:
|
|||
utslag.
|
||||
- **For en utvidelse** (en ny mekanisme i `modell/utvidelser/`): et grensetilfelle som gjenskaper kjernen eksakt
|
||||
(største avvik `0.0`), og en test som viser det. `grensetilfelle()` og grensesnittet står i `docs/utvidelser.md`;
|
||||
testen av grensetilfellet følger med automatisk, men legg gjerne til en test av det mekanismen gjør utenfor
|
||||
grensetilfellet. Kontrollen skal si «bit for bit som notatet» eller «innenfor toleranse».
|
||||
testen av grensetilfellet følger med automatisk. Oppgi `GJENSKAPER_NOTATET` når standardverdiene gjenskaper noen
|
||||
av notatets scenariofiler, så sjekkes grensetilfellet også mot notatets datafiler, og legg gjerne til en test av
|
||||
det mekanismen gjør utenfor grensetilfellet. Kontrollen skal si «bit for bit som notatet» eller «innenfor
|
||||
toleranse». Sier den at utvidelsen ikke gjenskaper kjernen i grensetilfellet, er utvidelsen feil.
|
||||
- **For en endring i kjernen** (`modell/kjerne/`): listen over notatets resultater som flytter seg (kontrollen sier
|
||||
hvilke datafiler og utskrifter, og hvor mye), hvilken figur eller tabell i notatet de hører til
|
||||
hvilke datafiler, utskrifter og scenariofiler, og hvor mye), hvilken figur eller tabell i notatet de hører til
|
||||
(`docs/modellkart.md`, del (d)), og hvorfor det er ment. Kjernen er en kopi av notatets kode, så en endring der
|
||||
må også inn i notatets repository før den kan tas inn i pluginen.
|
||||
- **Ingen persondata og ingen data fra enkeltsaker.** Modellen brukes på kategorier og aggregerte tall. Data til
|
||||
|
|
|
|||
29
CHANGELOG.md
29
CHANGELOG.md
|
|
@ -8,23 +8,32 @@ Første versjon.
|
|||
|
||||
- Fire ferdigheter på norsk: `diagnose` (leddet som binder, tiltakstype og kapasitetsbehov fra egne tall), `forlop`
|
||||
(stabilitetssjekk og forløp måned for måned), `simuler` (fra «hva om …» til scenariofil, kjøring, tabell og figur)
|
||||
og `forbedre` (arbeidskopi, modellkart, utvidelser med grensetilfelle og kontroll av hva en endring flytter).
|
||||
og `forbedre` (arbeidskopi, modellkart, utvidelser med grensetilfelle og kontroll av hva en endring flytter). Finnes
|
||||
en egen versjon av modellen i brukerens mappe, spør ferdighetene før de bruker den, og sier hva kontrollen sier om
|
||||
den.
|
||||
- Modellen bak notatet *Den dynamiske rettsstaten*: `modell/kjerne/` har uendrede kopier av `sim.py`, `diagnose.py`
|
||||
og `forlop.py` fra notatets repository ved commit 2badc25, låst med sha256 i `modell/kjerne/KILDE.json`.
|
||||
og `forlop.py` fra notatets repository ved commit 2badc25.
|
||||
- `modell/kjor.py`: én inngang for alle kommandoene (`diagnose`, `forlop`, `scenario`, `notatet`, `kontroll`,
|
||||
`miljo`, `arbeidskopi`), bare standardbiblioteket. Den finner en Python med numpy og scipy, og installerer dem bare
|
||||
i en egen mappe etter `miljo --opprett`.
|
||||
- `kontroll`: sammenligner kjernen, diagnosen, forløpet og en full kjøring av notatets simulering med fasiten (22
|
||||
datafiler og utskriftene), og sier om modellen regner bit for bit som notatet, innenfor toleranse eller er endret.
|
||||
i en egen mappe etter `miljo --opprett`. Feltnavn den ikke kjenner i inndata til diagnosen og forløpet, stopper
|
||||
regningen med et forslag til riktig navn.
|
||||
- `kontroll`: måler kjernen og fasiten mot notatets egne sjekksummer, og sammenligner diagnosen, forløpet, en full
|
||||
kjøring av notatets simulering (22 datafiler og utskriften), utvidelsenes grensetilfeller og scenariokjøreren med
|
||||
fasiten. Sier om modellen regner bit for bit som notatet, innenfor toleranse eller er endret, og hva som ikke er
|
||||
kontrollert når numpy eller scipy mangler.
|
||||
- Scenariokjøreren med scenarioformat på norsk (`docs/scenarioformat.md`): alle fem simulatorene i kjernen,
|
||||
overstyring av parameterne, beslutningsregler, sjokk, tiltak og sveip over én eller to parametere. Ut: sammendrag,
|
||||
CSV per kjøring og `resultat.json` med alle parametere, versjoner og sjekksummer.
|
||||
- 21 scenariofiler som gjenskaper 20 av notatets 22 datafiler (de to siste er analytiske), og fem scenarioer notatet
|
||||
ikke har figur for.
|
||||
overstyring av parameterne, beslutningsregler, sjokk, tiltak og sveip over én eller to parametere. Endres en
|
||||
parameter som bestemmer utgangspunktet, stopper kjøringen, med mindre scenarioet sier om utgangspunktet skal
|
||||
kalibreres på nytt eller kjøres fra ubalansen (`startlikevekt`). Ut: sammendrag, CSV per kjøring og
|
||||
`resultat.json` med alle parametere, versjoner og sjekksummer.
|
||||
- 21 scenariofiler som gjenskaper 20 av notatets 22 datafiler (de to siste er analytiske), og seks scenarioer notatet
|
||||
ikke har figur for, blant dem en nullinje uten sjokk.
|
||||
- Utvidelser ved siden av kjernen, med regelen fra notatet om et grensetilfelle som gjenskaper kjernen eksakt.
|
||||
Gjennomført eksempel: `paadrag_tidsserie` (pådraget følger en tidsserie i stedet for ett varig sjokk). Mal i
|
||||
`docs/utvidelser.md`.
|
||||
- `arbeidskopi`: en kopi av modellen brukeren eier og kan endre, også kjernen.
|
||||
- Dokumentasjon: inndata, scenarioformat, modellkart (ligning → funksjon → parameter), utvidelser og forbehold.
|
||||
Eksempelfiler: stiliserte tall som gjenskaper avsnitt 9.5, og offentlige norske tall for 2025.
|
||||
Forbeholdene sier blant annet at utgangspunktet i notatets modeller med kø i domstolen ikke er en eksakt likevekt,
|
||||
og hvor mye modellen driver uten sjokk. Eksempelfiler: stiliserte tall som gjenskaper avsnitt 9.5, og offentlige
|
||||
norske tall for 2025.
|
||||
- `BIDRA.md`: hvordan en forbedring sendes tilbake.
|
||||
|
|
|
|||
36
CLAUDE.md
36
CLAUDE.md
|
|
@ -17,19 +17,23 @@ justice chain (mostly non-programmers) and researchers. The note and its code li
|
|||
the commands that need them; installs nothing unless `miljo --opprett` is run.
|
||||
- `modell/kjerne/`: `sim.py`, `diagnose.py`, `forlop.py`, unmodified copies from the note's repo, pinned by sha256 in
|
||||
`modell/kjerne/KILDE.json`. numpy and scipy pinned in `modell/requirements.txt` (as the note).
|
||||
- `fasit/`: reference output (22 data files, printouts) that `kontroll` compares against.
|
||||
- `fasit/`: reference output (22 data files and 5 printouts, 27 files) that `kontroll` compares against.
|
||||
- `modell/scenario.py` (scenario runner over the core's five simulators), `modell/kontroll.py` (reproduction check),
|
||||
`modell/arbeidskopi.py` (copies the model to a folder the user owns), `modell/utvidelser/` (mechanisms outside the
|
||||
core; each must reproduce the core exactly in a limit case).
|
||||
- `docs/`: `inndata.md`, `scenarioformat.md`, `modellkart.md`, `utvidelser.md`, `forbehold.md`, Norwegian. The test for
|
||||
extensions reads the template in `utvidelser.md` between the markers `<!-- mal:start -->` and `<!-- mal:slutt -->`.
|
||||
- `eksempler/`: `eksempel_domstol.json` (stylized), `norge_2025.json` (public Norwegian figures), `scenarioer/`
|
||||
(five scenarios, and `notatet/` with the files that regenerate the note's data files).
|
||||
(six scenarios of our own, and `notatet/` with 21 files that regenerate 20 of the note's 22 data files).
|
||||
|
||||
## Conventions
|
||||
- **Never edit `modell/kjerne/`.** It is synced from the note's repo: copy the three files at a given commit, update
|
||||
the commit and sha256 values in `KILDE.json`, rebuild `fasit/` and run `kontroll`. A test fails if a file does not
|
||||
match its sha256. No lint on the core. Changes to the model go in `modell/utvidelser/` or in a user's working copy.
|
||||
- **Never edit `modell/kjerne/`.** It is synced from the note's repo, and these change together in one commit: the
|
||||
three files copied at the new commit; the commit and sha256 values in `modell/kjerne/KILDE.json`; `fasit/` rebuilt
|
||||
with the note's own environment (its 22 data files must be byte-identical to the note's `paper/data/` at that
|
||||
commit); and the constants `NOTATETS_COMMIT`, `NOTATETS_KJERNE` (3 sha256) and `NOTATETS_FASIT` (all 27 `fasit/`
|
||||
files) in `modell/kontroll.py`. `kontroll` anchors on those constants, not on `KILDE.json`, so updating `KILDE.json`
|
||||
or `fasit/` alone makes it report a change. Then run the full `kontroll`. A test fails if a core file does not match
|
||||
its sha256. No lint on the core. Changes to the model go in `modell/utvidelser/` or in a user's working copy.
|
||||
- User-facing text (skills, docs, script messages) is Norwegian bokmål, plain and direct, with the note's terms (ledd,
|
||||
skranke, restanse, utnyttelse, saksbehandlingstid, ledet utenom, den koordinerte regelen). Code, comments and this
|
||||
file may be English.
|
||||
|
|
@ -41,18 +45,30 @@ justice chain (mostly non-programmers) and researchers. The note and its code li
|
|||
variables in Bash. Skills write them literally into the command; `kjor.py` treats an empty `--data` or one containing
|
||||
`${` as not given and falls back to `~/.dynamisk-rettsstat`.
|
||||
- Skills never invent numbers, show the numbers as understood before computing, divide yearly figures by 12 and say
|
||||
so, relay script numbers verbatim, carry the caveats, and never install anything without asking.
|
||||
so, relay script numbers verbatim, carry the caveats, and never install anything without asking. A
|
||||
`rettsstat-modell/` in the user's folder is used only after asking, and only after `kontroll --rask` on it has been
|
||||
run and its level told to the user.
|
||||
- Input to `diagnose`/`forlop`: `kjor.py` rejects unknown field names in a `ledd` or in `styring` (exit 2, with a
|
||||
suggestion); `merknad`, `kilde`, `kilder` are allowed there, and top-level fields are not checked.
|
||||
- Scenarios: a changed base parameter stops the run unless the file sets `startlikevekt` (`kalibrer` or `ubalanse`);
|
||||
skills let the user choose and never pick. The models with a court queue drift slowly even without a shock (the
|
||||
note's own start is not an exact equilibrium); `docs/forbehold.md` has the numbers.
|
||||
- Exit codes of `kjor.py`: 0 ok, 1 differences found by `kontroll`, 2 input or usage error (a core `sys.exit("...")`
|
||||
passes through as 2 with the message unchanged), 3 numpy/scipy missing.
|
||||
|
||||
## Commands
|
||||
- Development environment (versions pinned in `pyproject.toml`, group `dev`): `python3 -m venv .venv && .venv/bin/pip install --group dev`
|
||||
- Tests: `.venv/bin/pytest` (fast, about 1.5 min); `.venv/bin/pytest -m treg` runs the note's full simulation (about 2.5 min)
|
||||
- Tests: `.venv/bin/pytest` (about 2.5 minutes on the development machine, measured 2026-11-11);
|
||||
`.venv/bin/pytest -m treg` runs the note's full simulation (not timed).
|
||||
- Lint and types (the core is excluded in `pyproject.toml`): `.venv/bin/ruff check .` and `.venv/bin/mypy .`
|
||||
- Reproduction check against the note: `.venv/bin/python modell/kjor.py kontroll` (full run, about 75 s) or
|
||||
`.venv/bin/python modell/kjor.py kontroll --rask`
|
||||
- Reproduction check against the note: `.venv/bin/python modell/kjor.py kontroll` (full run; about 1.5 minutes on the
|
||||
development machine, measured 2026-11-11) or `.venv/bin/python modell/kjor.py kontroll --rask` (skips the full run of
|
||||
`sim.py`). Six parts: core and `fasit/` against the note's checksums, `diagnose`, `forlop`, full run, extensions'
|
||||
limit cases, scenario runner against `fasit/data`.
|
||||
- Try the skills' commands: `python3 modell/kjor.py diagnose eksempler/eksempel_domstol.json`,
|
||||
`python3 modell/kjor.py forlop eksempler/eksempel_domstol.json`
|
||||
`python3 modell/kjor.py forlop eksempler/eksempel_domstol.json`,
|
||||
`python3 modell/kjor.py scenario eksempler/scenarioer/sjokkstorrelse_kjede.json --ut <scratch folder>` (`forlop` and
|
||||
`scenario` need numpy and scipy; `.venv/bin/python` has them)
|
||||
- Validate the plugin: `claude plugin validate .`
|
||||
- Load the plugin locally: `claude --plugin-dir .`
|
||||
|
||||
|
|
|
|||
36
README.md
36
README.md
|
|
@ -83,7 +83,7 @@ Claude beskriver scenarioet med ord, kjører det når du har sagt ja, og viser n
|
|||
|
||||
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 fem ferdige scenarioer, og 21 scenariofiler som lager notatets
|
||||
figur laget av de samme tallene. Pluginen har seks ferdige scenarioer, og 21 scenariofiler som lager notatets
|
||||
figurgrunnlag på nytt.
|
||||
|
||||
### Forbedre modellen (`forbedre`)
|
||||
|
|
@ -95,11 +95,14 @@ 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
|
||||
...
|
||||
Nivå: endret: Kjernen, forlop, Full kjøring.
|
||||
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.
|
||||
```
|
||||
|
||||
|
|
@ -120,19 +123,36 @@ Notatet, simuleringskoden og PDF-ene ligger i
|
|||
|
||||
- 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 kjører hele notatets simulering og sammenligner med notatets 22 datafiler og utskriftene. Målt
|
||||
2026-11-11 med Python 3.14.0, numpy 2.5.4 og scipy 1.18.1: alle 22 datafilene er like byte for byte.
|
||||
Med andre versjoner av numpy og scipy sier kontrollen om tallene er like innenfor én enhet i siste siffer.
|
||||
- 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: alle 22 datafilene er like byte for byte, og 14 av
|
||||
14 scenariofiler gjenskaper notatets datafiler byte for byte. Med andre versjoner av numpy og scipy sier kontrollen
|
||||
om tallene er like 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.
|
||||
`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. Ferdighetene bruker kopien når mappa du jobber i, har en.
|
||||
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
|
||||
|
|
@ -151,6 +171,10 @@ Slik sender du en forbedring tilbake: [BIDRA.md](BIDRA.md).
|
|||
- 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 nevner
|
||||
det ikke. 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.
|
||||
- Diagnosen regner på tallene slik de er oppgitt, og kapasitetsbehovet er et grovt anslag.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
# Forbehold
|
||||
|
||||
Forbeholdene ved modellen, diagnosen, forløpet og de norske eksempeltallene. De er hentet fra notatet *Den dynamiske
|
||||
rettsstaten* (avsnitt 9.8 og 10, vedlegg C), README i notatets repo og koden i `modell/kjerne/` (commit 2badc25).
|
||||
Forbeholdene ved modellen, simuleringene, diagnosen, forløpet og de norske eksempeltallene. De er hentet fra notatet *Den dynamiske
|
||||
rettsstaten* (avsnitt 9.8 og 10, vedlegg C), README i notatets repo, koden i `modell/kjerne/` (commit 2badc25) og kjøringer med
|
||||
den.
|
||||
Ferdighetene tar med de forbeholdene som gjelder for svaret de gir.
|
||||
|
||||
## Modellen som helhet
|
||||
|
|
@ -18,6 +19,13 @@ Ferdighetene tar med de forbeholdene som gjelder for svaret de gir.
|
|||
måleimperfeksjon. Resultatene er enkeltbaner uten parameterusikkerhet.
|
||||
- **Bare ett ledd har kø.** I notatets simuleringer er det domstolen; i `forlop` er det leddet som binder i dine tall.
|
||||
Etterforskning, påtale og straffegjennomføring har ellers verken kø, frafall eller kapasitet i modellen.
|
||||
- **Utgangspunktet i modellene med kø er nesten, men ikke helt, en likevekt.** Notatet kaller starttilstanden
|
||||
«utgangslikevekten», men i modellene der domstolen har kø, står den ikke helt i ro: saker som faller fra køen
|
||||
(henleggelse, foreldelse), blir aldri trukket fra kriminaliteten i modellens regnskap. Kjørt helt uten sjokk, med
|
||||
notatets verdier, går kriminaliteten fra 1,000 til 1,007 i måned 11, 1,015 i måned 120 og 1,018 i måned 240, og
|
||||
saksbehandlingstiden fra 3,0 til 3,1, 4,2 og 4,6 måneder, fortsatt stigende (målt 2026-11-11 med notatets kode,
|
||||
`eksempler/scenarioer/uten_sjokk_kjede.json`). Notatet nevner det ikke. En liten del av det kjedescenarioene viser
|
||||
etter sjokket, er denne driften.
|
||||
- **Kostnader er ikke regnet i kroner.** Målfunksjonen er stilt opp, men ikke brukt. Ingen kostnader eller gevinster
|
||||
er tallfestet, og modellens størrelser er normaliserte, ikke årsverk eller kroner.
|
||||
- **Beslutningsreglene er stiliserte.** Reglene for påtale og budsjett er representasjoner av hvordan myndighetene kan
|
||||
|
|
@ -26,6 +34,24 @@ Ferdighetene tar med de forbeholdene som gjelder for svaret de gir.
|
|||
- **Andelen som kan ledes utenom** er i praksis bestemt av sakenes art og av hjemlene i straffeprosessloven. Den er
|
||||
et rettspolitisk valg, ikke en styringsparameter.
|
||||
|
||||
## Simuleringene (`simuler`)
|
||||
|
||||
- **Notatets verdier, normaliserte størrelser.** Alt scenariofila ikke setter, er notatets stiliserte verdier. Kø,
|
||||
strøm og kapasitet er modellens normaliserte størrelser, ikke saker, årsverk eller kroner. Køen står i sammendraget
|
||||
i måneder av innstrømningen før sjokket.
|
||||
- **Driften i modellene med kø** (over) gjelder alle scenarioer med domstolskø. Sammendraget viser hvor langt
|
||||
modellen har drevet fram til sjokket. Når små virkninger betyr noe, sammenlign med en kjøring uten sjokk med samme
|
||||
parametere og horisont, og trekk driften fra.
|
||||
- **Endrede grunnparametere.** Endres en parameter som bestemmer utgangspunktet (for eksempel politiets effektivitet
|
||||
eller tilliten ved start), står modellen ikke lenger i ro ved start. Kjøreren stopper da, med mindre scenarioet sier
|
||||
om utgangspunktet skal kalibreres på nytt eller kjøres fra ubalansen (`startlikevekt` i `docs/scenarioformat.md`).
|
||||
De to valgene svarer på ulike spørsmål og gir ulike tall.
|
||||
- **Beslutningsreglene** (`simulate_endo`) bruker notatets strøm av saker ved start som observasjon de første
|
||||
månedene. Et scenario som endrer den strømmen, stopper; det krever en endring i kjernen.
|
||||
- **Store utslag.** Går kriminaliteten utenfor området kjernen er laget for (K mellom 0,01 og 12), kjøres scenarioet,
|
||||
men sammendraget har en merknad: ligningene er ikke laget for så store utslag. Vokser løsningen over alle grenser,
|
||||
stopper kjøringen.
|
||||
|
||||
## Diagnosen (`diagnose`)
|
||||
|
||||
- **Saksbeh.tid** er restanse delt på kapasitet, ikke målt saksbehandlingstid. Kolonnen vises bare når målet er
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
`diagnose` og `forlop` leser samme fil: en JSON-fil med ett objekt per ledd i straffesakskjeden. Denne siden
|
||||
beskriver hvert felt slik kjernens kode leser det (`modell/kjerne/diagnose.py`: `sjekk`, `analyser`, `TALLFELT`;
|
||||
`modell/kjerne/forlop.py`: `les_styring`, `modell`). Kjernen er en uendret kopi av koden i notatet *Den dynamiske
|
||||
rettsstaten* (commit 2badc25).
|
||||
rettsstaten* (commit 2badc25). Feltnavnene sjekkes av `modell/kjor.py` før kjernen leser fila.
|
||||
|
||||
## Enheter
|
||||
|
||||
|
|
@ -35,7 +35,8 @@ Tall skrives med punktum som desimaltegn og uten tusenskille: `29044.5`, ikke `2
|
|||
for dem.
|
||||
- `styring` (valgfritt): brukes bare av `forlop`. Se under.
|
||||
- Andre felt på øverste nivå (for eksempel `merknad` og `kilder`) leses ikke av koden. Bruk dem til å skrive ned
|
||||
hvor tallene kommer fra.
|
||||
hvor tallene kommer fra. I hvert ledd og i `styring` kan merknadsfeltene `merknad`, `kilde` og `kilder` stå i
|
||||
tillegg til feltene under; de leses heller ikke av regningen.
|
||||
|
||||
## Feltene i hvert ledd
|
||||
|
||||
|
|
@ -62,9 +63,15 @@ Krav som kontrolleres før regningen (`sjekk`):
|
|||
|
||||
Brudd på kravene gir en norsk melding som sier hvilket ledd og hvilket felt det gjelder, og ingen regning.
|
||||
|
||||
**Feltnavn med skrivefeil blir ikke oppdaget.** Koden leser bare feltene over og ser bort fra alt annet. Står det
|
||||
`prognose_innstrømning` (med ø) eller `maks_andel_utenfor`, regner verktøyet stille med standardverdien. Feltnavnene
|
||||
skrives uten æ, ø og å, nøyaktig som i tabellen.
|
||||
**Feltnavn med skrivefeil stopper regningen.** Før `diagnose` og `forlop` regner, sjekker `kjor.py` feltnavnene i
|
||||
hvert ledd og i `styring`. Et navn som ikke er et av feltene over eller et merknadsfelt (`merknad`, `kilde`,
|
||||
`kilder`), gir exit-kode 2 og en melding som sier hvilket ledd det gjelder og foreslår det nærmeste gyldige navnet:
|
||||
|
||||
```
|
||||
Feil i inndata, ledd 3 (Domstol): feltet "prognose_innstrømning" finnes ikke. Mente du "prognose_innstromning"? Gyldige felt: navn, innstromning, kapasitet, restanse, maal_tid, prognose_innstromning, maks_andel_utenom, restanse_for_12_mnd, restanse_maal, skjult_avgang, innstromning_for_okning, merknad, kilde, kilder.
|
||||
```
|
||||
|
||||
Feltnavnene skrives uten æ, ø og å, nøyaktig som i tabellen. Felt på øverste nivå sjekkes ikke.
|
||||
|
||||
## Hvordan feltene brukes i regningen
|
||||
|
||||
|
|
@ -94,7 +101,8 @@ avvikles over 24 måneder, og bestilt kapasitet virker gradvis fra 6 til 24 mån
|
|||
| `reaktivitet` | – | 3 | over 0, høyst 50 | prosent mer innsats per prosent avvik fra målet (3 betyr at 10 % over målet gir 30 % mer innsats) |
|
||||
|
||||
Uten `styring` brukes regime A i notatet (3 og 3), og `forlop` sier fra om det. Står `styring` i fila, men ett av
|
||||
feltene mangler, brukes standardverdien for det feltet uten merknad.
|
||||
feltene mangler, brukes standardverdien for det feltet uten merknad. Feltnavnene i `styring` sjekkes også når
|
||||
`diagnose` kjøres, så en skrivefeil der stopper begge.
|
||||
|
||||
## Hva `forlop` krever i tillegg
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,10 @@ hvilke kontroller som skal holde etter en endring.
|
|||
|
||||
## (a) Tilstandsvariabler og avledede størrelser
|
||||
|
||||
Tidsenhet: måned. Nivåene er normalisert slik at referanselikevekten har K = 1, T = 1 og Λ = 0,80.
|
||||
Tidsenhet: måned. Nivåene er normalisert slik at referanselikevekten har K = 1, T = 1 og Λ = 0,80. I modellene med kø i
|
||||
domstolen er starttilstanden nesten, men ikke helt, en likevekt: ved start er K′ = ϑ ς_D Q_D > 0, fordi det som faller
|
||||
fra køen, aldri trekkes fra K (ligningen for K′ under). Uten sjokk kryper K og τ_D derfor sakte oppover; se
|
||||
`forbehold.md` for hvor mye.
|
||||
|
||||
| I koden | Symbol | Betyr | Merknad |
|
||||
|---|---|---|---|
|
||||
|
|
@ -267,3 +270,6 @@ alle 22 datafilene ble byte-like notatets.
|
|||
`simulate_soc` har ingen utskrevet grensetilfelle. `forlop.py` kontrollerer sin egen kopi mot `simulate_endo` i hver
|
||||
kjøring (bit for bit, se over). Den som endrer kjernen, kjører kontrollene på nytt og ser at avvikene fortsatt er 0
|
||||
eller på avrundingsnivå, og at de 22 datafilene er byte-like med mindre endringen skal endre resultatene.
|
||||
`kjor.py kontroll` gjør dette og mer: den måler kjernen og fasiten mot notatets sjekksummer, kjører diagnosen,
|
||||
forløpet, hele `sim.py`, grensetilfellene i utvidelsene og scenariokjøreren, og sier hvilke av notatets resultater som
|
||||
har flyttet seg.
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ SEN_FASE = 60.0 # spennet i K måles etter denne måneden (som a
|
|||
SNITT_FRA = 12.0 # summary_endo: gjennomsnitt fra måned 12
|
||||
MAKS_KOLONNER_I_TABELL = 6
|
||||
CSV_HVERT = 20 # standard: én rad per måned (DT = 0,05)
|
||||
GRADVIS_ANDEL = 0.05 # første avvik under denne andelen av det største: pådraget stiger gradvis
|
||||
NOTAT_HVERT = 10 # write_csv i sim.py
|
||||
LIKEVEKT_TOL = 1e-12 # største tillatte rest i dK/dt ved start (pådraget er om lag 0,12 per måned)
|
||||
FLYTPARAMETERE = ("gamma", "Lam0", "T0") # gir strømmen J0 = gamma Lam0 T0 som domstolen er kalibrert for
|
||||
|
|
@ -1543,8 +1544,14 @@ def sjokkstart(k: Kjoring, r: Resultat) -> float | None:
|
|||
if k.modell == "simulate_soc":
|
||||
return k.sjokk["fra"] if k.sjokk["faktor"] != 1.0 else None
|
||||
if "Omega_faktor" in s:
|
||||
endret = np.flatnonzero(s["Omega_faktor"] != 1.0)
|
||||
return float(s["t"][endret[0]]) if endret.size else None
|
||||
avvik = np.abs(s["Omega_faktor"] - 1.0)
|
||||
endret = np.flatnonzero(avvik != 0.0)
|
||||
if not endret.size:
|
||||
return None
|
||||
i0 = int(endret[0])
|
||||
# Et pådrag som stiger gradvis, begynner i tidssteget før det første avviket (måned 12, ikke 12,05).
|
||||
gradvis = i0 > 0 and float(avvik[i0]) < GRADVIS_ANDEL * float(avvik.max())
|
||||
return float(s["t"][i0 - 1 if gradvis else i0])
|
||||
p = k.dicts["P"]
|
||||
return tallfelt(p, "t_shock") if tallfelt(p, "shock") != 1.0 else None
|
||||
|
||||
|
|
|
|||
|
|
@ -82,9 +82,9 @@ delt, den er et antall saker». Spør: «Stemmer dette?» Regn ikke før brukere
|
|||
|
||||
Skriv tallene som en JSON-fil i brukerens arbeidsmappe, for eksempel `rettsstat-tall.json`. Formatet, feltnavnene og
|
||||
reglene står i `${CLAUDE_PLUGIN_ROOT}/docs/inndata.md`; les den før du skriver fila første gang. Feltnavnene skrives
|
||||
nøyaktig som der, uten æ, ø og å: koden ser bort fra felt den ikke kjenner, så en skrivefeil gir stille en
|
||||
standardverdi. Skriv i `merknad` hvor tallene kommer fra og hva som er regnet om. Finnes fila fra før, spør før du
|
||||
overskriver den.
|
||||
nøyaktig som der, uten æ, ø og å: et feltnavn verktøyet ikke kjenner, i et ledd eller i `styring`, stopper regningen
|
||||
med en melding som foreslår det riktige. Skriv i `merknad` hvor tallene kommer fra og hva som er regnet om; `merknad`,
|
||||
`kilde` og `kilder` kan også stå i hvert ledd. Finnes fila fra før, spør før du overskriver den.
|
||||
|
||||
## 4. Kjør diagnosen
|
||||
|
||||
|
|
@ -94,15 +94,27 @@ python3 "${CLAUDE_PLUGIN_ROOT}/modell/kjor.py" --data "${CLAUDE_PLUGIN_DATA}" di
|
|||
|
||||
- På Windows heter tolken `python`.
|
||||
- `<fil>` er hele stien til inndatafila.
|
||||
- Har brukerens arbeidsmappe en egen arbeidskopi av modellen (mappa `rettsstat-modell/` med `modell/kjor.py` inni),
|
||||
legger du til `--modell <hele stien til rettsstat-modell/modell>` før `diagnose`, og sier til brukeren: «Jeg bruker
|
||||
din egen versjon av modellen i rettsstat-modell.» Bruk ellers pluginens modell.
|
||||
- Bruk pluginens modell, med mindre brukeren har valgt en egen versjon (se under).
|
||||
|
||||
**En egen versjon av modellen.** Har brukerens arbeidsmappe en mappe `rettsstat-modell/` med `modell/kjor.py` inni,
|
||||
bruk den ikke uten å spørre: «Jeg ser en egen versjon av modellen i rettsstat-modell. Skal jeg bruke den, eller
|
||||
pluginens?» Velger brukeren den egne, kjør kontrollen på den først:
|
||||
|
||||
```
|
||||
python3 "${CLAUDE_PLUGIN_ROOT}/modell/kjor.py" --data "${CLAUDE_PLUGIN_DATA}" --modell <hele stien til rettsstat-modell/modell> kontroll --rask
|
||||
```
|
||||
|
||||
Si nivået til brukeren før du legger fram noe tall: linja som begynner med «Nivå» («bit for bit som notatet», «endret:
|
||||
…», eller uten numpy og scipy «ingen avvik i det som ble kjørt (…)», som da bare gjelder kjernen, fasiten og
|
||||
diagnosen). Kjør så diagnosen med `--modell <hele stien til rettsstat-modell/modell>` før `diagnose`. Er versjonen
|
||||
endret, si sammen med svaret at tallene kommer fra brukerens egen versjon av modellen, ikke fra notatets.
|
||||
|
||||
Exit-koder:
|
||||
- **0**: diagnosen er regnet. Gå til trinn 5.
|
||||
- **2**: feil i inndata. Gjengi meldingen fra skriptet med vanlige ord (den sier hvilket ledd og hvilket tall), rett
|
||||
tallet sammen med brukeren, vis den rettede tabellen og kjør på nytt. Slutter meldingen med «Uventet feil i …», er
|
||||
det en feil i koden, ikke i tallene: gjengi den og si at diagnosen ikke ble regnet.
|
||||
- **2**: feil i inndata. Gjengi meldingen fra skriptet med vanlige ord (den sier hvilket ledd og hvilket tall, eller
|
||||
hvilket feltnavn verktøyet ikke kjenner og hva det trolig skulle være), rett sammen med brukeren, vis den rettede
|
||||
tabellen og kjør på nytt. Slutter meldingen med «Uventet feil i …», er det en feil i koden, ikke i tallene: gjengi
|
||||
den og si at diagnosen ikke ble regnet.
|
||||
- **Annen kode, eller `python3` finnes ikke**: gjengi meldingen som den er og si at diagnosen ikke ble regnet. Gjett
|
||||
ikke på et svar.
|
||||
|
||||
|
|
|
|||
|
|
@ -31,11 +31,14 @@ Avklar hvilken av tre ting det er. Spør med vanlige ord, og foreslå svaret nå
|
|||
| Brukeren vil | Det er | Slik gjøres det |
|
||||
|---|---|---|
|
||||
| prøve andre verdier for parameterne, en annen styringsregel, beslutningsregel, sjokk eller tiltak | **et scenario**: ingen kode endres | ferdigheten `simuler` |
|
||||
| legge til noe modellen ikke har (for eksempel et pådrag som varierer over tid, kø i et ledd til, målestøy) | **en utvidelse**: en ny mekanisme ved siden av kjernen, med et grensetilfelle som gjenskaper kjernen eksakt | trinn 2–7 |
|
||||
| legge til noe modellen ikke har (for eksempel kø i et ledd til, målestøy, forskyvning mellom kategorier) | **en utvidelse**: en ny mekanisme ved siden av kjernen, med et grensetilfelle som gjenskaper kjernen eksakt | trinn 2–7 |
|
||||
| endre ligningene modellen allerede har (en annen funksjonsform, en annen tilbakekobling) | **en endring i kjernen** | trinn 2–7 |
|
||||
|
||||
Mye som ser ut som en endring, er et scenario: alle kjernens parametere kan overstyres i en scenariofil (se
|
||||
`${CLAUDE_PLUGIN_ROOT}/docs/scenarioformat.md`). Er det et scenario, si det og gå over til ferdigheten `simuler`.
|
||||
`${CLAUDE_PLUGIN_ROOT}/docs/scenarioformat.md`), og et pådrag som varierer over tid finnes alt som utvidelsen
|
||||
`paadrag_tidsserie`. Er det et scenario, si det og gå over til ferdigheten `simuler`. Unntaket er beslutningsreglene
|
||||
for påtale og budsjett (`simulate_endo`) med en annen strøm av saker ved start, for eksempel mer effektivt politi:
|
||||
den stopper scenariokjøreren, fordi regelen i kjernen bruker notatets startstrøm. Det er en endring i kjernen.
|
||||
|
||||
Kan mekanismen stå ved siden av kjernen, anbefal en utvidelse framfor å endre kjernen: notatets resultater ligger da
|
||||
fast, og grensetilfellet viser at de gjør det.
|
||||
|
|
@ -53,15 +56,18 @@ python3 "${CLAUDE_PLUGIN_ROOT}/modell/kjor.py" --data "${CLAUDE_PLUGIN_DATA}" ar
|
|||
- På Windows heter tolken `python`. Bruk hele stien.
|
||||
- Kopien har modellen, eksemplene, fasiten, testene, dokumentasjonen og en `LES-MEG.md`. Den trenger ikke numpy og
|
||||
scipy for å lages.
|
||||
- Finnes mappa og er ikke tom, nekter kommandoen (den skriver aldri over noe). Har brukeren en kopi fra før, bruk
|
||||
den.
|
||||
- Ferdighetene `diagnose`, `forlop` og `simuler` bruker kopien selv når arbeidsmappa har en `rettsstat-modell/`.
|
||||
- Finnes mappa og er ikke tom, nekter kommandoen (den skriver aldri over noe). Den nekter også en mappe inne i
|
||||
pluginen. Har brukeren en kopi fra før, kjør kontrollen på den (trinn 6) og si nivået før du bygger videre.
|
||||
- Ferdighetene `diagnose`, `forlop` og `simuler` spør om de skal bruke kopien når arbeidsmappa har en
|
||||
`rettsstat-modell/`, og sier hvilket nivå kontrollen gir den.
|
||||
- `modell/kontroll.py` i kopien har notatets sjekksummer som faste verdier; det er dem kontrollen måler mot. Endre
|
||||
den ikke: da sier kontrollen ikke lenger noe om notatet.
|
||||
|
||||
**Forskere som bruker git** kan i stedet klone pluginens repository (`https://git.fromaitochitta.com/open/dynamisk-rettsstat.git`),
|
||||
endre der og starte Claude Code med pluginen fra klonen: `claude --plugin-dir .` i mappa. Da bruker ferdighetene
|
||||
klonens modell direkte, og endringene kan sendes tilbake med `git format-patch`. Kontrollen vet ikke at en klone er
|
||||
en arbeidskopi: ved «endret» sier den at pluginens modell skal regne som notatet, og kaller det en feil. For en
|
||||
endring som er ment, er det en opplysning; si det til brukeren.
|
||||
klonens modell direkte, og endringene kan sendes tilbake med `git format-patch`. En klone er ikke merket som
|
||||
arbeidskopi, så ved «endret» sier kontrollen at det er en feil hvis det er pluginen slik den er installert, og en
|
||||
opplysning hvis modellen er endret med vilje. Si til brukeren hvilket av de to det er.
|
||||
|
||||
## 3. Finn stedet i modellen
|
||||
|
||||
|
|
@ -96,7 +102,7 @@ Få et ja på dette før du skriver kode.
|
|||
## 5. Gjør endringen
|
||||
|
||||
**En utvidelse.** Følg `${CLAUDE_PLUGIN_ROOT}/docs/utvidelser.md`: grensesnittet (`NAVN`, `BESKRIVELSE`,
|
||||
`PARAMETERE`, `simuler`, `grensetilfelle`, og valgfritt `BRUKER` og `sjekk`), malen mellom `<!-- mal:start -->` og
|
||||
`PARAMETERE`, `simuler`, `grensetilfelle`, og valgfritt `BRUKER`, `sjekk` og `GJENSKAPER_NOTATET`), malen mellom `<!-- mal:start -->` og
|
||||
`<!-- mal:slutt -->` og trinnene der. Kort:
|
||||
- Fila er `rettsstat-modell/modell/utvidelser/<navn>.py`, og `NAVN` er filnavnet uten `.py`.
|
||||
- Kopier løkka fra simulatoren du bygger på uendret, og legg mekanismen inn slik at den forsvinner i grensetilfellet.
|
||||
|
|
@ -104,6 +110,8 @@ Få et ja på dette før du skriver kode.
|
|||
- Standardverdiene i `PARAMETERE` bør være grensetilfellet.
|
||||
- `grensetilfelle()` kjører utvidelsen i grensetilfellet og kjernen med de samme forutsetningene, og returnerer
|
||||
største absolutte avvik.
|
||||
- Gjenskaper utvidelsen med standardverdiene en av notatets scenariofiler, oppgi dem i `GJENSKAPER_NOTATET`. Da
|
||||
sjekker testene grensetilfellet også uavhengig av utvidelsens egen `grensetilfelle()`, mot notatets datafiler.
|
||||
|
||||
**En endring i kjernen.** Endre `rettsstat-modell/modell/kjerne/sim.py` (og kopiene i `diagnose.py` og `forlop.py`
|
||||
når det trengs). Endre bare det hypotesen gjelder.
|
||||
|
|
@ -121,15 +129,22 @@ Kjør kontrollen på kopien etter hver endring:
|
|||
python3 "${CLAUDE_PLUGIN_ROOT}/modell/kjor.py" --data "${CLAUDE_PLUGIN_DATA}" --modell <hele stien til rettsstat-modell/modell> kontroll
|
||||
```
|
||||
|
||||
- Den fulle kontrollen kjører hele notatets simulering og tar om lag ett til to minutter. Mens du prøver deg fram,
|
||||
kan du legge til `--rask` (hopper over den fulle kjøringen); kjør den fulle før du sier hva endringen gjør.
|
||||
- Kontrollen sammenligner med notatets resultater i `fasit/`: kjernens sjekksummer, utskriften fra diagnosen og
|
||||
forløpet på begge eksempelfilene, de 22 datafilene og utskriften fra `sim.py`, og grensetilfellet i hver
|
||||
utvidelse.
|
||||
- Den fulle kontrollen kjører hele notatets simulering og tar et par minutter. Mens du prøver deg fram, kan du legge
|
||||
til `--rask` (hopper over den fulle kjøringen av `sim.py`); kjør den fulle før du sier hva endringen gjør.
|
||||
- Kontrollen måler mot notatets egne sjekksummer, som står fast i `modell/kontroll.py`, ikke mot filene i kopien.
|
||||
Den har seks deler, nummerert slik i utskriften:
|
||||
1. kjernen (`sim.py`, `diagnose.py`, `forlop.py`) og fasiten (27 filer) mot notatets sjekksummer;
|
||||
2. diagnosen på begge eksempelfilene mot fasit, tegn for tegn;
|
||||
3. forløpet på begge eksempelfilene mot fasit;
|
||||
4. full kjøring av `sim.py`: de 22 datafilene og utskriften mot fasit (ikke med `--rask`);
|
||||
5. grensetilfellet i hver utvidelse, som skal gi avvik eksakt `0.0`;
|
||||
6. scenariokjøreren: notatets scenariofiler kjørt gjennom kopiens kjører, mot fasit (13 filer med `--rask`, 14 i
|
||||
den fulle).
|
||||
|
||||
Exit-koder: **0** bit for bit eller innenfor toleranse, **1** endret, **2** feil bruk, **3** numpy eller scipy
|
||||
mangler. Ved 3 er det som kunne kjøres uten dem, kjørt. Spør: «Kontrollen trenger to vanlige regnebiblioteker for
|
||||
Python, numpy og scipy. Skal jeg installere dem i en egen mappe for denne pluginen?» Bare hvis svaret er ja:
|
||||
mangler. Ved 3 er bare kjernen, fasiten og diagnosen kontrollert. Spør: «Kontrollen trenger to vanlige
|
||||
regnebiblioteker for Python, numpy og scipy. Skal jeg installere dem i en egen mappe for denne pluginen?» Bare hvis
|
||||
svaret er ja:
|
||||
|
||||
```
|
||||
python3 "${CLAUDE_PLUGIN_ROOT}/modell/kjor.py" --data "${CLAUDE_PLUGIN_DATA}" miljo --opprett
|
||||
|
|
@ -139,22 +154,25 @@ Gjengi det kommandoen sier, og kjør kontrollen på nytt.
|
|||
|
||||
**Les dommen for brukeren.** Den står i linja som begynner med «Nivå», nederst:
|
||||
- **«bit for bit som notatet»**: endringen flytter ingen av notatets resultater. For en utvidelse er det det som skal
|
||||
skje, og grensetilfellet er eksakt.
|
||||
skje, og grensetilfellet er eksakt. Står det «(uten full kjøring, --rask)», er `sim.py` ikke kjørt i sin helhet; si
|
||||
ikke at endringen er kontrollert før den fulle kontrollen er kjørt.
|
||||
- **«innenfor toleranse»**: hvert tall avviker med høyst én enhet i siste viste siffer, som med andre versjoner av
|
||||
numpy og scipy. Notatets resultater står.
|
||||
- **«ingen avvik i det som ble kjørt (…). Ikke kontrollert: …»**: numpy eller scipy mangler. Si hva som ikke er
|
||||
kontrollert, med kontrollens ord. Det er ikke en dom over endringen.
|
||||
- **«endret: …»**: noe har flyttet seg. Si det rett ut, og si hva:
|
||||
- hvilke datafiler som er endret, og største absolutte avvik per kolonne (står i detaljene). Bruk modellkartet,
|
||||
del (d), til å si hvilken figur eller tabell i notatet hver datafil hører til;
|
||||
- hvilke datafiler som er endret, og største absolutte avvik per kolonne (står i detaljene, under del 4 og 6).
|
||||
Bruk modellkartet, del (d), til å si hvilken figur eller tabell i notatet hver datafil hører til;
|
||||
- hvilke linjer i diagnosen, forløpet og utskriften fra `sim.py` som er endret (detaljene viser dem som «notatet» og
|
||||
«nå»), med tallene slik de står;
|
||||
- om kjernen er endret (punkt 1), og om et grensetilfelle ikke lenger er eksakt (punkt 5).
|
||||
- om kjernen eller fasiten er endret (del 1). Er fasiten endret, sier sammenligningene mot den ingenting om
|
||||
notatet.
|
||||
|
||||
En endret kjerne er en opplysning, ikke en feil: kontrollen sier det selv i en arbeidskopi. Men det skal sies
|
||||
tydelig, og **brukeren avgjør om endringen var ment**. Var den ment, gå videre. Flytter en utvidelse notatets
|
||||
resultater, eller er grensetilfellet ikke `0.0`, er noe galt i utvidelsen: finn feilen før du går videre.
|
||||
|
||||
Står det «uten full kjøring, --rask» eller «bare det som er kjørt» i nivålinja, gjelder dommen bare en del av
|
||||
kontrollen. Si det, og si ikke at endringen er kontrollert før den fulle kontrollen er kjørt.
|
||||
tydelig, og **brukeren avgjør om endringen var ment**. Var den ment, gå videre.
|
||||
- **En utvidelse som ikke gjenskaper kjernen** (del 5: «… gjenskaper ikke kjernen i grensetilfellet. Det er en feil i
|
||||
utvidelsen …»): det er en feil, også i en arbeidskopi, og resultatene utvidelsen gir, kan ikke brukes før den er
|
||||
rettet. Finn feilen før du går videre.
|
||||
|
||||
Gjengi tallene fra kontrollen slik de står. Regn ikke ut egne avvik.
|
||||
|
||||
|
|
|
|||
|
|
@ -41,8 +41,9 @@ Forløpet kan bruke tre ting til. Spør om dem, men bare når brukeren har talle
|
|||
| Hvor kraftig reagerer innsatsen: hvor mange prosent mer innsats per prosent over målet? | 3 (10 % over målet gir 30 % mer innsats) |
|
||||
| Hvor mange saker kom inn per måned før strømmen begynte å øke? | 95 % av kapasiteten |
|
||||
|
||||
De to første er regime A i notatet. Si det når du bruker dem. De legges i `styring` i fila; det tredje er
|
||||
`innstromning_for_okning` i leddet.
|
||||
De to første er regime A i notatet. Si det når du bruker dem. De legges i `styring` i fila (`forsinkelse` og
|
||||
`reaktivitet`); det tredje er `innstromning_for_okning` i leddet. Feltnavnene skrives nøyaktig som i
|
||||
`docs/inndata.md`: et navn verktøyet ikke kjenner, stopper kjøringen med et forslag til det riktige.
|
||||
|
||||
**Hvilket ledd.** Uten valg følger forløpet leddet diagnosen peker på. Vil brukeren se et annet ledd, oppgis navnet
|
||||
nøyaktig slik det står i fila.
|
||||
|
|
@ -58,11 +59,21 @@ python3 "${CLAUDE_PLUGIN_ROOT}/modell/kjor.py" --data "${CLAUDE_PLUGIN_DATA}" fo
|
|||
|
||||
- På Windows heter tolken `python`.
|
||||
- `<fil>` er hele stien til inndatafila.
|
||||
- Har brukerens arbeidsmappe en egen arbeidskopi av modellen (mappa `rettsstat-modell/` med `modell/kjor.py` inni),
|
||||
legger du til `--modell <hele stien til rettsstat-modell/modell>` før `forlop`, og sier til brukeren: «Jeg bruker din
|
||||
egen versjon av modellen i rettsstat-modell.»
|
||||
- Bruk pluginens modell, med mindre brukeren har valgt en egen versjon (se under).
|
||||
- En kjøring tar noen sekunder.
|
||||
|
||||
**En egen versjon av modellen.** Har brukerens arbeidsmappe en mappe `rettsstat-modell/` med `modell/kjor.py` inni,
|
||||
bruk den ikke uten å spørre: «Jeg ser en egen versjon av modellen i rettsstat-modell. Skal jeg bruke den, eller
|
||||
pluginens?» Velger brukeren den egne, kjør kontrollen på den først:
|
||||
|
||||
```
|
||||
python3 "${CLAUDE_PLUGIN_ROOT}/modell/kjor.py" --data "${CLAUDE_PLUGIN_DATA}" --modell <hele stien til rettsstat-modell/modell> kontroll --rask
|
||||
```
|
||||
|
||||
Si nivået til brukeren før du legger fram noe tall: linja som begynner med «Nivå» («bit for bit som notatet» eller
|
||||
«endret: …»). Kjør så forløpet med `--modell <hele stien til rettsstat-modell/modell>` før `forlop`. Er versjonen
|
||||
endret, si sammen med svaret at tallene kommer fra brukerens egen versjon av modellen, ikke fra notatets.
|
||||
|
||||
Exit-koder:
|
||||
- **0**: skriptet har svart. Det kan også bety at forløpet ikke ble regnet; se trinn 3.
|
||||
- **3**: numpy eller scipy mangler. Si i én setning: «Forløpet trenger to vanlige regnebiblioteker for Python, numpy og
|
||||
|
|
@ -76,7 +87,8 @@ Exit-koder:
|
|||
forløpet på nytt. Feiler installasjonen, gjengi meldingen og si at diagnosen fortsatt kan brukes uten tilleggene.
|
||||
- **2**: skriptet har stoppet med en melding. Les den:
|
||||
- *Feil i inndata*, *Fant ikke fila*, *ikke gyldig JSON* eller *Fant ikke leddet*: gjengi meldingen med vanlige ord,
|
||||
rett sammen med brukeren og kjør på nytt.
|
||||
rett sammen med brukeren og kjør på nytt. Et feltnavn verktøyet ikke kjenner, i et ledd eller i `styring`, gir
|
||||
*Feil i inndata* med et forslag til riktig navn («Mente du …?»).
|
||||
- Meldingen begynner med *Forløpet …* (for eksempel at leddet ikke var i balanse før økningen, at prognosen ikke er
|
||||
høyere enn strømmen før økningen, eller at den er for høy): tallene ligger utenfor det modellen dekker. Si det med
|
||||
vanlige ord. Spør om tallet for saker inn før økningen er kjent (uten det brukes 95 % av kapasiteten), og si at
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: simuler
|
||||
description: "Kjører modellens simuleringer i notatet Den dynamiske rettsstaten med egne forutsetninger: fra et spørsmål («hva om …») til en scenariofil, en kjøring, en tabell med nøkkeltall og tilbud om figur. Dekker styringen (forsinkelse, reaktivitet, MPC), parameterne, beslutningsreglene for påtale og budsjett, sjokk, tiltak (andel ledet utenom, mer kapasitet i domstolen) og sveip over én eller to parametere, og gjenskaper notatets figurer. Bruk når noen vil prøve modellen med andre forutsetninger, sammenligne regler eller tiltak, se hvor grensen for svingninger går, eller lage notatets figurer på nytt. Utløses av «hva om forsinkelsen er seks måneder», «kjør et scenario», «simuler», «sammenlign reglene», «sveip over», «hva skjer med et større sjokk», «lag figuren i notatet på nytt», «run a scenario», «simulate the model with other assumptions»."
|
||||
description: "Kjører modellens simuleringer i notatet Den dynamiske rettsstaten med egne forutsetninger: fra et spørsmål («hva om …») til en scenariofil, en kjøring, en tabell med nøkkeltall og tilbud om figur. Dekker styringen (forsinkelse, reaktivitet, MPC), parameterne, beslutningsreglene for påtale og budsjett, sjokk, tiltak (andel ledet utenom, mer kapasitet i domstolen) og sveip over én eller to parametere, og gjenskaper notatets figurer. Bruk når noen vil prøve modellen med andre forutsetninger, sammenligne regler eller tiltak, se hvor grensen for svingninger går, eller lage notatets figurer på nytt. Utløses av «hva om forsinkelsen er seks måneder», «hva om politiet blir mer effektivt», «kjør et scenario», «simuler», «sammenlign reglene», «sveip over», «hva skjer med et større sjokk», «lag figuren i notatet på nytt», «run a scenario», «simulate the model with other assumptions»."
|
||||
---
|
||||
|
||||
# Kjør modellen med egne forutsetninger
|
||||
|
|
@ -18,6 +18,7 @@ feltnavn eller JSON med mindre brukeren spør etter dem, eller viser at de kjenn
|
|||
- **Finn aldri på et tall.** Forutsetningene er brukerens eller notatets. Alt scenariofila ikke setter, er notatets
|
||||
verdier; si hvilke som er brukt når det betyr noe for svaret.
|
||||
- **Vis scenarioet med ord, og få et ja før du kjører.**
|
||||
- **Velg aldri på brukerens vegne** hvordan en endret grunnparameter skal behandles (trinn 2).
|
||||
- **Gjengi skriptets tall ordrett.** Regn aldri om, avrund aldri annerledes og «forbedre» aldri et tall. Vil brukeren
|
||||
vite hva som skjer med andre forutsetninger, endrer du scenarioet og kjører på nytt.
|
||||
- **Si hver gang** at parameterne er notatets stiliserte verdier, ikke kalibrert på norske data, og at kjøringene
|
||||
|
|
@ -48,6 +49,7 @@ verdier, side om side. To parametere gir et rutenett.
|
|||
| `sjokkstorrelse_kjede.json` | hvor mye betyr størrelsen på sjokket når domstolen er en flaskehals? |
|
||||
| `kvalitetssloyfe.json` | hva gjør kvalitetssløyfen med desentraliserte og koordinerte regler? |
|
||||
| `utvidelse_bolge.json` | hva etterlater en forbigående bølge i kriminalitetspresset, med og uten flaskehals? |
|
||||
| `uten_sjokk_kjede.json` | hvor mye driver modellen med kø i domstolen av seg selv, uten sjokk? Nullinjen for små virkninger (trinn 5) |
|
||||
|
||||
I undermappa `notatet/` ligger 21 scenariofiler som til sammen lager 20 av notatets 22 datafiler på nytt, det
|
||||
figurene i notatet tegnes fra (regimene i figur 4, scenario 1–5 med domstolen, robusthet, vippepunkt og de endogene
|
||||
|
|
@ -67,14 +69,37 @@ Beskriv scenarioet med ord før du kjører:
|
|||
verdier (styring, sjokk, parametere, regel).
|
||||
- **Over hvor mange måneder**, og hvor mange kjøringer det blir.
|
||||
|
||||
**Når spørsmålet endrer en grunnparameter.** Noen av parameterne bestemmer utgangspunktet modellen starter i: for
|
||||
eksempel politiets effektivitet (`gamma`), tilliten ved start, innsatsen ved start, det strukturelle pådraget og den
|
||||
naturlige avgangen (hele listen står under «`startlikevekt`» i `docs/scenarioformat.md`). «Hva om politiet blir 20 %
|
||||
mer effektivt» er en slik endring. Da står modellen ikke lenger i ro ved start, og uten et valg stopper kjøringen
|
||||
med en melding om det. Forklar de to veiene med vanlige ord, og la brukeren velge:
|
||||
|
||||
- **Start i ro med de nye verdiene** (`"startlikevekt": "kalibrer"`): utgangspunktet regnes om slik notatet
|
||||
kalibrerer sitt, så modellen starter i balanse også med den nye verdien. Da sammenlignes to verdener som begge
|
||||
starter i ro, og det er sjokket og tiltakene som skiller dem. Sammendraget sier hvilke verdier som ble regnet om,
|
||||
fra hva og til hva.
|
||||
- **Start i notatets utgangspunkt med den nye verdien** (`"startlikevekt": "ubalanse"`): modellen begynner å bevege
|
||||
seg før sjokket kommer, fordi utgangspunktet ikke lenger passer. Det viser hva endringen gjør med en kjede som var
|
||||
i balanse. Sammendraget sier hva som er ute av balanse, og hvor langt modellen har drevet fram til sjokket.
|
||||
|
||||
Velg aldri selv. Vet du før kjøringen at spørsmålet endrer en grunnparameter, spør med en gang; stopper kjøringen med
|
||||
meldingen, spør da.
|
||||
|
||||
**Beslutningsreglene for påtale og budsjett** (`simulate_endo`) tåler ikke en annen strøm av saker ved start: der
|
||||
stopper kjøringen uansett valg når politiets effektivitet, tilliten, innsatsen ved start, `eta` eller `ksat` endres.
|
||||
Si det rett ut: i den modellen er det en endring i kjernen, og det er ferdigheten `forbedre`. Den koblede modellen
|
||||
uten beslutningsregler (`simulate_chain`) kan ofte svare på det samme spørsmålet; tilby den.
|
||||
|
||||
Spør: «Skal jeg kjøre dette?» Kjør ikke før brukeren har sagt ja.
|
||||
|
||||
## 3. Skriv scenariofila
|
||||
|
||||
Skriv scenarioet som en JSON-fil i brukerens arbeidsmappe, med et kort `navn` uten mellomrom og en `beskrivelse` som
|
||||
sier spørsmålet med vanlige ord (den står øverst i sammendraget). Feltnavnene skrives nøyaktig som i
|
||||
`docs/scenarioformat.md`. Finnes fila fra før, spør før du overskriver den. Gi en ny variant et nytt `navn`, så
|
||||
resultatet fra forrige kjøring blir stående.
|
||||
`docs/scenarioformat.md`. Har brukeren valgt hvordan utgangspunktet skal behandles, står valget i `startlikevekt`.
|
||||
Finnes fila fra før, spør før du overskriver den. Gi en ny variant et nytt `navn`, så resultatet fra forrige kjøring
|
||||
blir stående.
|
||||
|
||||
## 4. Kjør
|
||||
|
||||
|
|
@ -84,13 +109,23 @@ python3 "${CLAUDE_PLUGIN_ROOT}/modell/kjor.py" --data "${CLAUDE_PLUGIN_DATA}" sc
|
|||
|
||||
- På Windows heter tolken `python`.
|
||||
- `<fil>` er hele stien til scenariofila. `<mappe>` er `resultater/<navn>` i brukerens arbeidsmappe, med hele stien.
|
||||
Finnes mappa med et tidligere resultat av samme scenario, erstattes det. Finnes den med andre filer, stopper
|
||||
kjøreren uten å skrive noe.
|
||||
- Har brukerens arbeidsmappe en egen arbeidskopi av modellen (mappa `rettsstat-modell/` med `modell/kjor.py` inni),
|
||||
legger du til `--modell <hele stien til rettsstat-modell/modell>` før `scenario`, og sier til brukeren: «Jeg bruker
|
||||
din egen versjon av modellen i rettsstat-modell.» Bruk ellers pluginens modell.
|
||||
- Et scenario med noen få kjøringer tar noen sekunder. MPC er tregt (om lag 7 sekunder per kjøring), og et rutenett
|
||||
med mange kjøringer tar tilsvarende lenger.
|
||||
Finnes mappa med et tidligere resultat fra kjøreren, erstattes de filene; andre filer blir stående. Finnes den med
|
||||
andre filer og uten et slikt resultat, stopper kjøreren uten å skrive noe.
|
||||
- Bruk pluginens modell, med mindre brukeren har valgt en egen versjon (se under).
|
||||
- Et scenario med noen få kjøringer tar noen sekunder. MPC er klart tregere, og et rutenett med mange kjøringer tar
|
||||
tilsvarende lenger.
|
||||
|
||||
**En egen versjon av modellen.** Har brukerens arbeidsmappe en mappe `rettsstat-modell/` med `modell/kjor.py` inni,
|
||||
bruk den ikke uten å spørre: «Jeg ser en egen versjon av modellen i rettsstat-modell. Skal jeg bruke den, eller
|
||||
pluginens?» Velger brukeren den egne, kjør kontrollen på den først:
|
||||
|
||||
```
|
||||
python3 "${CLAUDE_PLUGIN_ROOT}/modell/kjor.py" --data "${CLAUDE_PLUGIN_DATA}" --modell <hele stien til rettsstat-modell/modell> kontroll --rask
|
||||
```
|
||||
|
||||
Si nivået til brukeren før du legger fram noe tall: linja som begynner med «Nivå» («bit for bit som notatet» eller
|
||||
«endret: …»). Kjør så scenarioet med `--modell <hele stien til rettsstat-modell/modell>` før `scenario`. Er versjonen
|
||||
endret, si sammen med svaret at tallene kommer fra brukerens egen versjon av modellen, ikke fra notatets.
|
||||
|
||||
Exit-koder:
|
||||
- **0**: kjøringen er gjort. Gå til trinn 5.
|
||||
|
|
@ -103,15 +138,19 @@ Exit-koder:
|
|||
|
||||
Gjengi det kommandoen sier (blant annet om resultatene da kontrolleres bit for bit eller med toleranse), og kjør på
|
||||
nytt. Feiler installasjonen, gjengi meldingen og si at diagnosen fortsatt kan brukes uten tilleggene.
|
||||
- **2**: skriptet har stoppet med en melding. Les den:
|
||||
- *Feil i scenariofila …*: meldingen nevner feltet og de gyldige verdiene, og foreslår det nærmeste ved en
|
||||
- **2**: skriptet har stoppet med en melding, og ingenting er skrevet. Les den:
|
||||
- *Feil i scenariofila … startlikevekt: startpunktet er ikke en likevekt …*: en grunnparameter er endret. Gjengi
|
||||
hva meldingen sier er ute av balanse, med vanlige ord, og la brukeren velge en av de to veiene i trinn 2.
|
||||
- *Feil i scenariofila … parametere.P: simulate_endo i kjernen bruker 0,1 …*: beslutningsreglene tåler ikke
|
||||
endringen (trinn 2). Det er en endring i kjernen; tilby `simulate_chain` eller ferdigheten `forbedre`.
|
||||
- *Feil i scenariofila …* ellers: meldingen nevner feltet og de gyldige verdiene, og foreslår det nærmeste ved en
|
||||
skrivefeil. Gjengi den med vanlige ord, rett fila, vis endringen og kjør på nytt. Er det brukerens forutsetning
|
||||
som ikke er tillatt (for eksempel en andel over 1), spør hva som var ment.
|
||||
- *… er ikke gyldig JSON*: rett fila og kjør på nytt.
|
||||
- *Kjøringen … stoppet i kjernen*: kombinasjonen av forutsetninger gir ingen likevekt ved start eller en løsning
|
||||
som vokser over alle grenser. Si det med vanlige ord, og hvilken kjøring det gjaldt. Ingenting er skrevet. Endre
|
||||
aldri en forutsetning bare for at kjøringen skal gå; spør brukeren.
|
||||
- *--ut: mappa … finnes og har filer …*: velg en annen mappe og si hvilken.
|
||||
- *Kjøringen … stoppet i kjernen* eller *Kjøringen … ga verdier som ikke er endelige tall*: kombinasjonen av
|
||||
forutsetninger gir en regnefeil i kjernen eller en løsning som vokser over alle grenser. Si det med vanlige ord,
|
||||
og hvilken kjøring det gjaldt. Endre aldri en forutsetning bare for at kjøringen skal gå; spør brukeren.
|
||||
- *--ut: mappa … finnes og har filer …* eller *Kan ikke skrive i …*: velg en annen mappe og si hvilken.
|
||||
- *Uventet feil i …*: en feil i koden, ikke i scenarioet. Gjengi meldingen og si at kjøringen ikke ble gjort.
|
||||
- **Annen kode, eller `python3` finnes ikke**: gjengi meldingen og si at kjøringen ikke ble gjort. Gjett ikke på et
|
||||
svar.
|
||||
|
|
@ -119,24 +158,37 @@ Exit-koder:
|
|||
## 5. Presenter svaret
|
||||
|
||||
1. **Vis nøkkeltallene slik skriptet skrev dem.** Kjøreren skriver sammendraget til skjermen og til `sammendrag.md`.
|
||||
Vis tabellen (eller tabellene) under «Nøkkeltall» uendret, med linja «Slik leses tallene» under, og for
|
||||
Vis tabellen (eller tabellene) under «Nøkkeltall» uendret, med avsnittet «Slik leses tallene» under, og for
|
||||
beslutningsreglene budsjettvedtakene. Ikke avrund, regn om eller formater tallene på nytt, og ta ikke bort rader.
|
||||
Er tabellen svært stor, vis radene brukeren spurte om, og si hvor resten står.
|
||||
2. **Les den med vanlige ord**, kort: hva endringen gjør i modellen, i hvilken retning og hvor mye, med skriptets
|
||||
tall. Pek på det som er verdt å se: høyeste mot slutt (har forløpet funnet en ny balanse?), vedvarende svingning
|
||||
(spennet de siste 60 månedene), saksbehandlingstid og tillit, og kapasitet og andel ledet utenom der de endres.
|
||||
Si ikke mer enn tallene viser.
|
||||
3. **Forbehold** som alltid tas med:
|
||||
2. **Gjengi det sammendraget sier om utgangspunktet og om kjøringen**, ordrett:
|
||||
- de omregnede verdiene, når utgangspunktet er kalibrert på nytt («Referansetilstanden er kalibrert på nytt …»);
|
||||
- linjene under «Slik har modellen drevet før sjokket»;
|
||||
- linjene under «Merknader (kjøringen er ikke stoppet)», for eksempel at kriminaliteten går langt utenfor området
|
||||
modellen er laget for, eller at sjokket kommer etter slutten av kjøringen. Si hva det betyr for hvor mye tallene
|
||||
kan brukes.
|
||||
3. **Les tabellen med vanlige ord**, kort: hva endringen gjør i modellen, i hvilken retning og hvor mye, med
|
||||
skriptets tall. Pek på det som er verdt å se: høyeste mot slutt (har forløpet funnet en ny balanse?), vedvarende
|
||||
svingning (spennet de siste 60 månedene), saksbehandlingstid og tillit, og kapasitet og andel ledet utenom der de
|
||||
endres. Køen i domstolen står i måneder av innstrømningen før sjokket (4,6 betyr at køen tilsvarer 4,6 måneders
|
||||
saker inn), ikke i antall saker. Si ikke mer enn tallene viser.
|
||||
4. **Driften i modellene med kø.** Modellene der domstolen har kø (den koblede modellen, modellen med to sakstyper,
|
||||
beslutningsreglene og utvidelser med kjede), står ikke helt i ro ved start, heller ikke med notatets verdier: det
|
||||
som faller fra køen, blir aldri trukket fra kriminaliteten, så kriminaliteten og saksbehandlingstiden kryper sakte
|
||||
oppover også uten sjokk. Sammendraget viser hvor langt fram til sjokket. Er virkningen brukeren ser på liten,
|
||||
tilby å sammenligne med en kjøring uten sjokk med samme parametere og horisont (`"sjokk": {"faktor": 1}`; for
|
||||
notatets koblede modell over 240 måneder er det `uten_sjokk_kjede.json`), og si at driften må trekkes fra før
|
||||
virkningen tolkes.
|
||||
5. **Forbehold** som alltid tas med:
|
||||
- Parameterne er notatets stiliserte verdier (tabell 3 i notatet), ikke kalibrert på norske data, unntatt det
|
||||
scenarioet setter selv. Kjøringene viser modellens dynamikk, ikke prognoser. Rekkefølgen og retningen er
|
||||
poenget, ikke nivåene.
|
||||
- Kø, strøm og kapasitet er i modellens normaliserte enheter, ikke saker eller årsverk. 1,00 er nivået før
|
||||
sjokket.
|
||||
- Kø, strøm og kapasitet er normaliserte størrelser, ikke saker eller årsverk. 1,00 er nivået ved start.
|
||||
- Bare ett ledd har kø i modellen (domstolen); politi, påtale og kriminalomsorg har ikke kø.
|
||||
|
||||
Ta i tillegg med det som gjelder dette scenarioet, fra `${CLAUDE_PLUGIN_ROOT}/docs/forbehold.md` (for eksempel at
|
||||
beslutningsreglene er stiliserte, eller at andelen som kan ledes utenom er et rettspolitisk valg).
|
||||
4. **Si hvor filene ligger**: sammendraget, én CSV-fil per kjøring (én rad per måned) og `resultat.json` med alle
|
||||
6. **Si hvor filene ligger**: sammendraget, én CSV-fil per kjøring (én rad per måned) og `resultat.json` med alle
|
||||
parametere slik de ble brukt, versjonene og sjekksummene. Samme scenariofil gir samme filer, så kjøringen kan
|
||||
etterprøves.
|
||||
|
||||
|
|
@ -151,10 +203,11 @@ Spør: «Vil du se dette som en figur?» Lag den bare hvis svaret er ja.
|
|||
- **Én kurve per kjøring**, med kjøringens navn fra sammendraget i forklaringen (for eksempel «forsinkelse=6»).
|
||||
- **Aksene på norsk**: «Tid (måneder)» og størrelsen, for eksempel «Kriminalitet K», «Tillit», «Politiets innsats
|
||||
T», «Saksbehandlingstid i domstolen (måneder)», «Kapasitet (1,00 = ved start)» eller «Andel til domstolen». Hva
|
||||
kolonnene betyr, står i `docs/scenarioformat.md` («Tidsseriene per modell»).
|
||||
- **Ta med linja om hva 1,00 betyr** under figuren, som i sammendraget: «1,00 er nivået i referanselikevekten før
|
||||
sjokket for kriminaliteten K og politiets innsats T; tilliten er 0,80 der. Kapasitet: 1,00 er kapasiteten ved
|
||||
start.» Skriv i tillegg at tallene er modellens stiliserte dynamikk, ikke prognoser.
|
||||
kolonnene betyr, står i `docs/scenarioformat.md` («Tidsseriene per modell»). Køen `Q` i CSV-filene er i modellens
|
||||
enheter, ikke i måneder som i sammendraget; kall aksen «Kø i domstolen (modellens enheter)».
|
||||
- **Ta med forklaringen på hva 1,00 betyr** under figuren, slik sammendraget skrev den for denne kjøringen
|
||||
(«Slik leses tallene: …»; den er annerledes for modellene med kø og når utgangspunktet er ute av balanse). Skriv i
|
||||
tillegg at tallene er modellens stiliserte dynamikk, ikke prognoser.
|
||||
- Lagre figuren i resultatmappa og si hvor den ligger.
|
||||
|
||||
## Hva scenariokjøreren ikke gjør
|
||||
|
|
@ -166,9 +219,7 @@ Si det rett ut når spørsmålet ligger utenfor:
|
|||
modellens normaliserte størrelser.
|
||||
- **En mekanisme modellen ikke har** (for eksempel kø i flere ledd, målestøy, forskyvning mellom kategorier) kan
|
||||
ikke settes inn med en parameter. Den legges til som en utvidelse; det er ferdigheten `forbedre`.
|
||||
- **Endrer scenarioet** `P.gamma`, `P.Lam0` eller `P.T0`, regnes domstolens kapasitet og behandlingstid ikke om, og
|
||||
domstolen er da ikke lenger 95 % utnyttet før sjokket. Si det, og oppgi dem selv hvis brukeren vil ha det (se
|
||||
`docs/scenarioformat.md`).
|
||||
- **En annen startstrøm i beslutningsreglene** (trinn 2) er en endring i kjernen, ferdigheten `forbedre`.
|
||||
- Ingen kjøring kalibrerer modellen mot norske tidsserier eller lager prognoser.
|
||||
|
||||
## 7. Neste steg
|
||||
|
|
@ -176,5 +227,6 @@ Si det rett ut når spørsmålet ligger utenfor:
|
|||
Tilby det som passer:
|
||||
- en variant med én forutsetning endret, kjørt med nytt navn og vist ved siden av den første, med skriptets tall;
|
||||
- et sveip over forutsetningen brukeren er mest usikker på;
|
||||
- en kjøring uten sjokk som nullinje, når virkningen er liten;
|
||||
- notatets scenariofil for samme figur, for å se forskjellen mot notatets forutsetninger;
|
||||
- ferdigheten `forbedre`, hvis spørsmålet krever en mekanisme modellen ikke har.
|
||||
|
|
|
|||
|
|
@ -570,3 +570,10 @@ def test_modell_uten_ko_har_ingen_driftlinje(fil: str, tmp_path: Path, capsys: p
|
|||
assert "Slik leses tallene: 1,00 er nivået i referanselikevekten før sjokket" in ut
|
||||
assert "Fram til måned" not in ut
|
||||
assert "nesten, men ikke helt" not in ut
|
||||
|
||||
|
||||
def test_gradvis_paadrag_begynner_for_forste_avvik(tmp_path: Path, capsys: pytest.CaptureFixture[str]) -> None:
|
||||
kode, ut, _ = kjor_fil(NYE / "utvidelse_bolge.json", tmp_path / "ut", capsys)
|
||||
assert kode == 0
|
||||
assert "Fram til måned 12 har K gått fra 1,000 til 1,007" in ut
|
||||
assert "måned 12,05" not in ut
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue