feat(okr): arkivklar-kommando og GDPR-posisjon i governance
This commit is contained in:
parent
a9aab508d2
commit
42d75dfad8
6 changed files with 265 additions and 7 deletions
|
|
@ -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)
|
||||
|
|
|
|||
10
README.md
10
README.md
|
|
@ -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
89
commands/arkivklar.md
Normal 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
|
||||
|
|
@ -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 12–16) — 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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)',
|
||||
);
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue