feat(okr): arkivklar-kommando og GDPR-posisjon i governance

This commit is contained in:
Kjell Tore Guttormsen 2026-08-02 10:27:32 +02:00
commit 42d75dfad8
6 changed files with 265 additions and 7 deletions

View file

@ -19,6 +19,7 @@ Expert OKR guidance for Norwegian public sector. Google/Doerr methodology adapte
| `/okr:innboks` | Ingest documents dropped in `.claude/okr/innboks/` into the OKF tree — deterministic convert/split/frontmatter/index, per-document security gate |
| `/okr:rapport` | Generate a report from cycle data. Args: `tertial` \| `arsrapport` (annual report part III) \| `etatsstyring` (agency-governance meeting brief). Owns arithmetic and formatting invariants — never confidence, and never the assessment fields it reserves for the organization |
| `/okr:export` | Export OKR deliverables (quality review, gap matrix, status report, retrospective) to print-ready PDF via weasyprint |
| `/okr:arkivklar` | Assessment basis against bevaringsforskrifta (§§ 7/30, safety-net § 3) — what in the tree likely falls under the preservation duty and should be *considered* for transfer to the case/archive system. Read-only by tool list (no `Write`/`Edit`); never decides, never deletes |
| `/okr:freshen-references` | KB self-evaluator: score 18 of the 19 domain reference files against an anchored rubric — the quality rubric itself is excluded, since scoring the scoring instrument is circular — + currency-poll public sources |
| `/okr:help` | Full overview of all commands, agents, and recommended cycle workflow |
@ -98,6 +99,7 @@ Retrieval is on-demand via the `okr-second-brain-search` skill. The UserPromptSu
/okr:innboks ──→ scripts/innboks-ingest.mjs (convert → split → frontmatter → per-doc gate → relations → index)
/okr:rapport ──→ scripts/syklus-rapport.mjs ──→ lib/syklus-data.mjs (read + score) + lib/syklus-rapport.mjs (render)
/okr:export ──→ scripts/export-pdf.py (weasyprint, documented prerequisite)
/okr:arkivklar ──→ scripts/arkivklar.mjs ──→ lib/arkivklar.mjs (traverse + classify + render) + lib/path-confinement.mjs (read boundary)
/okr:freshen-references ──→ (inline KB-evaluator + currency-polling via WebSearch/Task)
/okr:help ──→ (inline command/agent/workflow overview)
SessionStart ──→ coaching-hook.mjs (proactive coaching)

View file

@ -132,6 +132,16 @@ Translate tildelingsbrev requirements into OKR. Map the governance chain (Storti
Renders any OKR deliverable — quality review, gap matrix, status report, or retrospective — to a print-ready A4 PDF for management or Riksrevisjon. Tables get striping and score cells are color-coded (green/yellow/red). PDF generation is a documented prerequisite (`pip install markdown weasyprint`, `brew install pango`), not bundled — a missing dependency exits with a clear install hint, never a traceback.
### Archive Readiness
```
> /okr:arkivklar
```
Reports which categories of bevaringsforskrifta (FOR-2025-12-19-2729) the tree's contents likely fall under — § 7 for the state governance line, § 30 for the municipal one, and the § 3 safety net for everything not named — and what should be *considered* for transfer to the organization's case/archive system. The two governance lines are parallel, not alternative: the same file can match a category in both, and both are reported.
The command decides nothing. Kassasjon requires authority from Nasjonalarkivet under arkivlova § 13, and the assessment itself belongs to the organization's documentation plan (arkivlova § 8, arkivforskrifta § 12 b). There is **no deletion model in this plugin and none will be added** — the command declares neither `Write` nor `Edit`, so it is read-only in the tool layer, not merely in prose. Falling under § 3 means the material *must be preserved*, not the opposite. The report also names what it cannot see: arkivforskrifta § 1 letter c makes the assessment conditional on whether the documentation is already managed as archive in another system, and that state is reported as unknown rather than assumed away.
### Inbox Ingestion
```

89
commands/arkivklar.md Normal file
View file

@ -0,0 +1,89 @@
---
name: okr:arkivklar
description: Vurderingsgrunnlag mot bevaringsforskrifta - hva i OKR-treet faller trolig under bevaringspaabudet, og hva boer vurderes overfoert til sak-arkivet
allowed-tools: Read, Bash, Glob
argument-hint: "[bundle-rot - default .claude/okr]"
---
# OKR Arkivklar - vurderingsgrunnlag mot bevaringsforskrifta
Gaa gjennom OKR-treet og rapporter hvilke kategorier i bevaringsforskrifta
(FOR-2025-12-19-2729) innholdet trolig faller under, og hva som boer **vurderes
overfoert** til virksomhetens sak-/arkivsystem.
## Hva denne kommandoen IKKE gjoer
**Den sletter ingenting, og den kan ikke slette noe.** Tool-lista over
inneholder verken `Write` eller `Edit` — kommandoen er lesende i verktoeylaget,
ikke bare i prosaen. Presedens: `commands/sporing.md`.
**Den tar heller ingen avgjoerelse.** Kassasjon — «å gjere til inkjes
dokumentasjon slik at han ikkje lenger finst» (arkivlova § 2 g) — krever enten
forskriftshjemmel fra Nasjonalarkivet eller loeyve derfra (arkivlova § 13).
Selve vurderingen hoerer til virksomhetens dokumentasjonsplan, jf. arkivlova § 8
og arkivforskrifta § 12 b. Ingen av delene kan avledes fra en filtype, og
verktoeyet forsoeker det ikke.
Det finnes **ingen slettemodell i denne pluginen**, og ingen skal innfoeres.
Trenger du aa arkivere en syklus eller ta ut innholdet, er det
`/okr:oppsett arkiver` og `/okr:export` som daekker det behovet.
## Kjoering
```bash
# Rapport til skjerm (default)
node "${CLAUDE_PLUGIN_ROOT}/scripts/arkivklar.mjs" .claude/okr
# Rapport til fil (skrives atomisk, ALDRI inn i bundlen selv)
node "${CLAUDE_PLUGIN_ROOT}/scripts/arkivklar.mjs" .claude/okr arkivklar-rapport.md
```
Exit-koder: `0` rapport produsert · `1` uventet feil (inkludert brudd paa
path-confinement) · `2` bruksfeil (manglende eller ukjent sti).
Kjoerer brukeren kommandoen uten argument, bruk `.claude/okr` som bundle-rot.
## Hva rapporten inneholder
| Seksjon | Paragraf | Innhold |
|---------|----------|---------|
| Statleg styringslinje | bevaringsforskrifta § 7 | tildelingsbrev, rapportar, etatsstyringsmoeter, evalueringa |
| Kommunal styringslinje | bevaringsforskrifta § 30 | handlingsprogram, tertialrapportering, aarsmelding |
| Ikke navngitt | bevaringsforskrifta § 3 | alt annet — **skal bevares** inntil Nasjonalarkivet har fastsett reglar |
De to styringslinjene er **parallelle, ikke alternative**. Samme fil kan treffe en
kategori i begge, og da rapporteres begge — verktoeyet velger ikke styringslinje
paa virksomhetens vegne.
At noe havner under § 3 betyr at det skal **bevares**, ikke det motsatte.
Sikringsparagrafen fastsetter at dokumentasjon som ikke er nevnt i forskrifta
skal takast vare paa inntil Nasjonalarkivet har fastsett reglar.
## Den ukjente forutsetningen
Arkivforskrifta § 1 bokstav c gjoer vurderingen betinget av om dokumentasjonen
**allerede blir sikra og forvalta som arkiv i eit anna informasjonssystem**.
Verktoeyet leser kun OKR-treet og ser ikke sak-/arkivsystemet. Rapporten navngir
derfor tilstanden som **ukjent** i stedet for aa anta den bort — det er en
avklaring virksomheten maa gjoere selv.
## Naar bruke
- Foer en syklus arkiveres, for aa se hva som boer over i sak-arkivet.
- Ved etablering av dokumentasjonsplan, som innspill om hva OKR-arbeidet faktisk
produserer av arkivpliktig materiale.
- Ved sporsmaal om personopplysninger i treet — se GDPR-posisjonen i
`references/okr-offentlig-governance.md`. Kortversjonen: pluginen sletter
ikke, den sperrer.
## Etter kjoering
Presenter rapporten, og vaer eksplisitt paa at den er et **grunnlag for
vurdering**, ikke en konklusjon. Foreslaa at virksomhetens arkivfaglige
ressurs tar stilling til overfoering. Ikke tilby aa slette noe.
## Referanser
- `references/okr-offentlig-governance.md` — GDPR-posisjonen og arkivregelverket
- Arkivlova LOV-2025-06-20-96 (i kraft 01.01.2026)
- Bevaringsforskrifta FOR-2025-12-19-2729 · arkivforskrifta FOR-2025-12-17-2647

View file

@ -28,6 +28,7 @@ kommandoene for det temaet. Ellers vis full oversikt.
| `/okr:innboks` | Ingest dokumenter fra innboksen (`.claude/okr/innboks/`) til kunnskapstreet |
| `/okr:rapport` | Generer rapport fra syklusdata: `tertial`, `arsrapport` (del III) eller `etatsstyring` — committed og aspirational hver for seg |
| `/okr:export` | Eksporter OKR-dokumenter til print-klar PDF (ledelse/Riksrevisjon) |
| `/okr:arkivklar` | Vurderingsgrunnlag mot bevaringsforskrifta (§§ 7/30, sikring § 3) — hva boer vurderes overfoert til sak-arkivet. Lesende: sletter aldri, avgjoer aldri |
| `/okr:freshen-references` | KB-selvevaluator + currency-polling av offentlige kilder |
| `/okr:help` | Denne oversikten — kommandoer, agenter, anbefalt arbeidsflyt |
@ -64,9 +65,10 @@ du er — coaching-hooken minner deg på dette ved sesjonsstart.
### Sent i syklus (uke 1216) — lukk og lær
8. `/okr:sporing` — endelig scoring
9. `/okr:export` — eksporter status/retrospektiv til PDF for ledelse/Riksrevisjon
10. `/okr:oppsett arkiver` — arkiver syklus, generer retrospektiv
11. `/okr:analyse` — se trender på tvers av sykluser
12. `/okr:skriv` — start neste syklus med lærdommene
10. `/okr:arkivklar` — se hva som boer vurderes overfoert til sak-arkivet foer syklusen lukkes
11. `/okr:oppsett arkiver` — arkiver syklus, generer retrospektiv
12. `/okr:analyse` — se trender på tvers av sykluser
13. `/okr:skriv` — start neste syklus med lærdommene
### Løpende vedlikehold
- `/okr:innboks` — dropp dokumenter i `.claude/okr/innboks/` og ingest dem til kunnskapstreet

View file

@ -11,10 +11,11 @@ Norsk offentlig sektor har unike styringsmekanismer som OKR må forholde seg til
3. [Politisk styring](#politisk-styring)
4. [Hierarkisk alignment](#hierarkisk-alignment)
5. [Revisjons- og kontrollperspektiv](#revisjons--og-kontrollperspektiv)
6. [Spesielle hensyn](#spesielle-hensyn)
7. [Konkrete eksempler](#konkrete-eksempler)
8. [Tillitsreformen og styringsspenningen](#tillitsreformen-og-styringsspenningen)
9. [Ressurser](#ressurser)
6. [Arkiv, GDPR og sletting](#arkiv-gdpr-og-sletting)
7. [Spesielle hensyn](#spesielle-hensyn)
8. [Konkrete eksempler](#konkrete-eksempler)
9. [Tillitsreformen og styringsspenningen](#tillitsreformen-og-styringsspenningen)
10. [Ressurser](#ressurser)
> **Gjelder statlig sektor.** Denne guiden beskriver den statlige styringslinjen:
> tildelingsbrev, etatsstyring og årsrapport til departementet. Kommuner og
@ -416,6 +417,87 @@ Riksrevisjonen har påpekt risiko for utilsiktede konsekvenser ved strenge resul
---
## Arkiv, GDPR og sletting
**Posisjonen i én setning: pluginen sletter ikke, den sperrer.**
Dette er ikke en avveining mellom to regelsett som trekker hver sin vei. Både
arkivlova og GDPR ender samme sted — behold, men skjerm.
### Regimeskiftet 01.01.2026
Hele arkivregelverket ble erstattet 1. januar 2026:
| Regelverk | Referanse |
|---|---|
| Lov om dokumentasjon og arkiv (arkivlova) | LOV-2025-06-20-96 |
| Arkivforskrifta | FOR-2025-12-17-2647 |
| Bevaringsforskrifta | FOR-2025-12-19-2729 |
Arkivverket heter fra samme dato **Nasjonalarkivet**. Eldre veiledning som viser
til arkivlova av 1992 er ikke lenger dekkende.
### Arkivlova § 13 — sletteplikt fra annen lov er ikke kassasjonshjemmel
Kassasjon er legaldefinert i arkivlova § 2 g som å «gjere til inkjes
dokumentasjon slik at han ikkje lenger finst». Et organ kan bare kassere
dokumentasjon som enten ikke skal tas vare på etter forskrift fra
Nasjonalarkivet, eller der Nasjonalarkivet har gitt løyve.
Det avgjørende for GDPR-spørsmålet står i **§ 13 tredje punktum**, ordrett:
> «Føresegner i andre lover om plikt til å slette opplysningar gir berre grunnlag
> for kassasjon når det er **klart fastsett** eller føresett at opplysningane
> ikkje skal finnast i arkiva for ettertida.»
Er vilkåret ikke oppfylt, skal sletteplikten i stedet oppfylles
**«på andre måtar enn ved kassasjon»** — altså ved sperring, skjerming eller
tilgangsbegrensning.
Konsekvensen er skarp: **GDPR art. 17 er i seg selv ikke kassasjonshjemmel.**
### GDPR art. 17 nr. 3 — unntakene peker samme vei
Sletteretten i art. 17 gjelder uansett ikke fullt ut her:
- **Art. 17 nr. 3 bokstav b** unntar behandling som er nødvendig for å oppfylle
en rettslig forpliktelse, eller «for å utføre en oppgave i allmennhetens
interesse eller utøve offentlig myndighet».
- **Art. 17 nr. 3 bokstav d** unntar behandling «for arkivformål i allmennhetens
interesse […] i samsvar med artikkel 89 nr. 1».
Merk asymmetrien: GDPR *tillater* å beholde, mens arkivlova *påbyr* det. Det er
ikke to regler i konflikt — det er én regel med et unntak som peker samme vei.
### Hva dette betyr for OKR-treet
Pluginens driftsområde ligger **innenfor** bevaringspåbudet, ikke utenfor det:
bevaringsforskrifta § 7 navngir tildelingsbrev, rapportar, etatsstyringsmøter og
evalueringa; § 30 navngir handlingsprogram, tertialrapportering og årsmelding.
Sikringsparagrafen § 3 lukker resten — det som ikke er nevnt, skal bevares inntil
Nasjonalarkivet har fastsett reglar.
Praktisk:
1. **Ingen automatisk kassasjon.** Verdien av et dokument avgjøres ofte av
hendelser *etter* at en ryddekommando ville kjørt — presedens er det klassiske
eksempelet. `/okr:arkivklar` rapporterer derfor grunnlag, aldri handling.
2. **Sletteforespørsel fra en registrert** håndteres av virksomheten etter
§ 13-vurderingen over, ikke ved å fjerne filer fra `.claude/okr/`.
3. **Vurderingen er betinget av noe verktøyet ikke ser.** Arkivforskrifta § 1
bokstav c gjør den avhengig av om dokumentasjonen «allereie blir sikra og
forvalta som arkiv i eit anna informasjonssystem». Den tilstanden er ukjent
for pluginen og må avklares av virksomheten.
4. **Sanksjonsapparatet er skjerpet** — arkivlova kap. 4 gir tilsyn, pålegg om
retting med tvangsmulkt og straff. Feil her er ikke en formalitet.
> **Organinterne dokumenter:** offentleglova § 14 lar et organ unnta dokument
> utarbeidet for egen saksforberedelse. Det er et **«kan»-unntak fra innsyn**, ikke
> et vern og ikke et unntak fra bevaringsplikt. At noe i `.claude/okr/` kan falle
> inn under § 14, sier derfor ingenting om hvorvidt det skal bevares.
---
## Spesielle hensyn
### Sektorovergripende mål

View file

@ -290,3 +290,76 @@ test('(18i) CLI skriver rapport atomisk til oppgitt fil, uten aa roere bundlen',
);
});
});
// ==================== (19) kommandoflaten og registrering ====================
const ROOT = fileURLToPath(new URL('..', import.meta.url));
const les = (rel) => readFileSync(join(ROOT, rel), 'utf8');
// Presedens: commands/sporing.md:4 -- en kommando uten skriveverktoey KAN ikke
// skrive, uansett hva prosaen lover. Tool-lista er den haandhevbare grensen;
// prosaen er det ikke. /okr:arkivklar er raadgivende og skal aldri kunne endre
// treet den vurderer.
const SKRIVEVERKTOEY = ['Write', 'Edit', 'NotebookEdit', 'MultiEdit'];
function allowedTools(rel) {
const m = les(rel).match(/^allowed-tools:\s*(.+)$/m);
assert.ok(m, `${rel}: mangler allowed-tools i frontmatter`);
return m[1].split(',').map((t) => t.trim());
}
test('(19a) arkivklar-kommandoen deklarerer ingen skriveverktoey', () => {
const tools = allowedTools('commands/arkivklar.md');
const forbudte = tools.filter((t) => SKRIVEVERKTOEY.includes(t));
assert.deepEqual(
forbudte,
[],
`/okr:arkivklar er lesende og skal ikke ha skriveverktoey; fant: ${forbudte.join(', ')}`,
);
assert.ok(tools.includes('Read'), 'kommandoen trenger Read');
assert.ok(tools.includes('Bash'), 'kommandoen trenger Bash for aa kjoere skriptet');
});
test('(19b) parser-sanity: vakten feiler faktisk om et skriveverktoey legges til', () => {
// Uten denne beviser (19a) bare at lista ikke inneholder noe -- den kunne
// bestaatt paa en tom/uparset liste. Her mates vakten en liste som SKAL felle.
const mutant = ['Read', 'Bash', 'Glob', 'Write'];
assert.deepEqual(
mutant.filter((t) => SKRIVEVERKTOEY.includes(t)),
['Write'],
'vakten skal fange Write om det legges til',
);
});
test('(19c) arkivklar er registrert paa alle kommandoflater', () => {
// D6-beslutning 7: en levert form skal synes paa ALLE flater samtidig.
// Sjekklista er commands/<navn>.md, commands/help.md, CLAUDE.md, README.md --
// help.md og README.md var nettopp de to som ble oversett i steg 12.
const mangler = [];
for (const f of ['CLAUDE.md', 'README.md', 'commands/help.md']) {
if (!/okr:arkivklar/.test(les(f))) mangler.push(f);
}
assert.deepEqual(mangler, [], `/okr:arkivklar mangler paa flate(r):\n${mangler.join('\n')}`);
});
test('(19d) GDPR-posisjonen staar i governance og ender paa «behold, men skjerm»', () => {
const gov = les('skills/okr-offentlig-sektor/references/okr-offentlig-governance.md');
for (const forventet of [
'klart fastsett', // arkivlova § 13 tredje punktum, ordrett
'andre måtar enn ved kassasjon',
'17 nr. 3', // GDPR art. 17 nr. 3 b og d
'LOV-2025-06-20-96',
'FOR-2025-12-19-2729',
'Nasjonalarkivet',
]) {
assert.ok(gov.includes(forventet), `governance mangler «${forventet}»`);
}
assert.ok(/sperrer|skjerm/i.test(gov), 'posisjonen skal formuleres som «sletter ikke, sperrer»');
// Datatilsynets vedtakskompetanse er KUN DELVIS verifisert (403 paa
// Nasjonalarkivets side). Den skal derfor ikke siteres med paragrafnummer.
assert.ok(
!/Datatilsynet[^.]{0,80}§\s*\d/.test(gov),
'Datatilsynets vedtakskompetanse skal ikke siteres med paragrafnummer (kun delvis verifisert)',
);
});