8 hygiene-fikser fra review 2026-07-16 par.4 kode-lista, TDD roed-groenn (suite 138 -> 149): - innboks-split: slugify translittererer ae/oe (datatap-fiks) - innboks-frontmatter: beskrivende feil ved manglende sourceMtime - okf-index: --okf-version bumper eksisterende rot, flagg-tolerant CLI (exit 2 ved manglende verdi), sanitizeEntry strip C1/zero-width/bidi/ Unicode-tag - write-org-profile: circuit-breaker MERGER i stedet for aa overskrive full config (M4); test beviser at eksisterende config overlever - compose-org-profile: intern ----linje trunkerer ikke blokken - coaching-hook: at-risk teller status-markerte tabellrader (M1/m1) - inject-okr-context: topic-guard treffer boeyningsformer (maalene) - frontmatter: BOM/CRLF-toleranse (falsk mangler-type-fiks) Versjonsflater bumpet til 1.7.1 (package/plugin/lock/CLAUDE/README/ SKILL x2/package-shape-test) + CHANGELOG 1.7.1-seksjon (B1+B2). Release-tag + katalog-ref venter paa [G-B] operatoer-go. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
104 lines
7.9 KiB
Markdown
104 lines
7.9 KiB
Markdown
# OKR Offentlig Sektor v1.7.1
|
|
|
|
Expert OKR guidance for Norwegian public sector. Google/Doerr methodology adapted for 4-month tertial cycles.
|
|
|
|
## Commands
|
|
|
|
| Command | Description |
|
|
|---------|-------------|
|
|
| `/okr:skriv` | Write new OKR with guided Objective and KR creation |
|
|
| `/okr:kvalitet` | Quality check OKR against rubric and antipatterns |
|
|
| `/okr:kaskade` | Cascade OKR from org to team, visualize alignment |
|
|
| `/okr:sporing` | Track progress, calculate scores, generate check-ins |
|
|
| `/okr:møter` | Plan OKR workshops, check-ins, reviews, 1:1s |
|
|
| `/okr:innføring` | OKR adoption planning, resistance handling, maturity |
|
|
| `/okr:governance` | Tildelingsbrev translation, Riksrevisjon compliance |
|
|
| `/okr:gap` | Automatic gap analysis between tildelingsbrev and current OKR |
|
|
| `/okr:analyse` | Cross-cycle analytics with Mermaid trend visualizations |
|
|
| `/okr:oppsett` | Configure plugin: onboarding interview (full/mvp), cycle archival, profile update. Args: `full\|mvp\|arkiver\|oppdater\|vis` |
|
|
| `/okr:innboks` | Ingest documents dropped in `.claude/okr/innboks/` into the OKF tree — deterministic convert/split/frontmatter/index, per-document security gate |
|
|
| `/okr:export` | Export OKR deliverables (quality review, gap matrix, status report, retrospective) to print-ready PDF via weasyprint |
|
|
| `/okr:freshen-references` | KB self-evaluator: score the 16 domain reference files against an anchored rubric + currency-poll public sources |
|
|
| `/okr:help` | Full overview of all commands, agents, and recommended cycle workflow |
|
|
|
|
## Agents
|
|
|
|
| Agent | Model | Color | Tools | Role |
|
|
|-------|-------|-------|-------|------|
|
|
| kvalitetssjekker | sonnet | blue | Read, Glob | Score OKR quality against rubric |
|
|
| kaskadebygger | sonnet | green | Read, Glob | Build OKR cascades between levels |
|
|
| fremdriftssporer | sonnet | yellow | Read, Glob, ToolSearch | Calculate scores and generate reports |
|
|
| møtefasilitator | sonnet | magenta | Read, Glob | Generate meeting agendas and materials |
|
|
| styringsrådgiver | opus | cyan | Read, Glob | Tildelingsbrev analysis, governance |
|
|
| gapanalytiker | sonnet | red | Read, Glob | Tildelingsbrev gap analysis and coverage matrix |
|
|
| trendanalytiker | sonnet | purple | Read, Glob | Cross-cycle trend analysis and Mermaid visualization |
|
|
|
|
## Hooks
|
|
|
|
| Event | Type | Purpose |
|
|
|-------|------|---------|
|
|
| SessionStart | command | Proactive coaching based on cycle position and OKR status |
|
|
| UserPromptSubmit | command | Inject org profile (expanded YAML), current cycle, `.claude/okr/` summary, and archived cycle count |
|
|
| PreCompact | prompt | Preserve OKR draft state during compaction |
|
|
|
|
## Skills
|
|
|
|
| Component | Location |
|
|
|-----------|----------|
|
|
| SKILL.md (okr-offentlig-sektor) | `skills/okr-offentlig-sektor/SKILL.md` |
|
|
| References (17) | `skills/okr-offentlig-sektor/references/` |
|
|
| SKILL.md (okr-second-brain-search) | `skills/okr-second-brain-search/SKILL.md` |
|
|
|
|
The second skill (`okr-second-brain-search`) does on-demand retrieval over the user's OKF-compatible wiki (native Glob/Read/Grep, no MCP) — see OKF Knowledge Layout below.
|
|
|
|
## State Management
|
|
|
|
User configuration: `.claude/okr.local.md` in the project directory (not in plugin root).
|
|
Org profile (reinstall-surviving): `~/.claude/okr/org/profil.md` — machine-global org identity (`organisasjon:`/`program:`), written atomically (temp + `renameSync`) by `scripts/write-org-profile.mjs` during `/okr:oppsett`. Resolution is most-specific-wins: project-local `.claude/okr.local.md` overrides the home profile (the backwards-compatible fallback when no project config exists; read side `hooks/scripts/inject-okr-context.mjs`). Home-write failure → circuit-break to the gitignored project-local file. Only the org *profile* migrates to home; cycle/`historikk` data stays cwd-bound.
|
|
Template: `templates/okr.local.md.template`
|
|
Context tree: `.claude/okr/` — `strategisk-kontekst/`, `syklus/[id]/`, `historikk/`, `dokumenter/`
|
|
Onboarding state: `onboarding_status` field in okr.local.md (`partial` | `fullfort`)
|
|
Cycle archival: `/okr:oppsett arkiver` — moves `syklus/` to `historikk/`, generates `retrospektiv.md`
|
|
|
|
## OKF Knowledge Layout
|
|
|
|
Context files carry OKF v0.1 Documents-style frontmatter (conforms to the OKF v0.1 minimal contract, canonized in `catalog/docs/okf-second-brain/spec.md`): a Title-Case `type` (`Organisasjonsprofil`, `Tildelingsbrev`, `Virksomhetsplan`, `Overordnede OKR`, `OKR`, `Retrospektiv`, `Status`) plus recommended `resource`/`title`/`description`/`tags`/`timestamp`. Only `type` is de-facto required. The flat frontmatter parser reads only single-line keys (`type`, profile/config fields); tree files may carry multi-line `tags` lists without breaking it. Files written by inbox ingestion additionally carry the provenance extension key `kilde: innboks`.
|
|
|
|
**Two bundle roots** with distinct lifecycles: project `.claude/okr/` (cwd-bound cycle/work) and home `~/.claude/okr/org/` (reinstall-surviving org identity). Each root carries its own `index.md` (no frontmatter; `# H1` + `* [title](link) - description`) and an `okf_version` marker. `okf-index`/`okf-check` run per root; retrieval Globs both (project preferred, else home).
|
|
|
|
- `lib/frontmatter.mjs` — shared frontmatter parser/writer; both hooks route through it (strips trailing ` #…` only from unquoted values).
|
|
- `scripts/okf-index.mjs` — regenerate a root's per-level `index.md` (verbatim OKF index format).
|
|
- `scripts/okf-check.mjs` — validate each concept file carries `type:` (exit 1 + count otherwise); report `okf_version` per root.
|
|
- `scripts/compose-org-profile.mjs` — build the nested org-profile YAML with top-level OKF keys (`type`/`resource`/`timestamp`) before piping to `write-org-profile.mjs`.
|
|
- `scripts/innboks-ingest.mjs` — inbox-ingestion orchestrator (`/okr:innboks`): walks `.claude/okr/innboks/`, converts (txt/md/docx/eml/pdf via `lib/innboks-convert.mjs`), heading-splits, stamps OKF frontmatter + `kilde: innboks`, routes by type, then gates each document with `okf-check --strict-ingest` — a failing document is discarded alone (staging + per-document rollback), survivors get relations and index entries. Non-destructive (originals stay in the inbox), idempotent by construction (timestamp = source mtime), path-confined (realpath). Binary formats need `npm install --ignore-scripts` (4 exact-pinned pure-JS deps); txt/md run dependency-free.
|
|
|
|
Retrieval is on-demand via the `okr-second-brain-search` skill. The UserPromptSubmit hook no longer pre-injects the full context-file enumeration — it emits the core profile plus one resolved pointer to `index.md` (< 512 B, independent of file count).
|
|
|
|
## Language Policy
|
|
|
|
- Commands, agents, user-facing text: Norwegian
|
|
- Code, config, technical identifiers: English
|
|
- SKILL.md: English (for broader LLM comprehension)
|
|
|
|
## Architecture
|
|
|
|
```
|
|
/okr:skriv ──→ kvalitetssjekker (auto)
|
|
/okr:kvalitet ──→ kvalitetssjekker
|
|
/okr:kaskade ──→ kaskadebygger
|
|
/okr:sporing ──→ fremdriftssporer ──→ Linear MCP (optional)
|
|
/okr:møter ──→ møtefasilitator
|
|
/okr:governance ──→ styringsrådgiver
|
|
/okr:innføring ──→ (inline, no agent)
|
|
/okr:gap ──→ gapanalytiker
|
|
/okr:analyse ──→ trendanalytiker
|
|
/okr:oppsett ──→ (inline wizard: full/mvp/arkiver/oppdater/vis)
|
|
/okr:oppsett arkiver ──→ cycle archival + retrospektiv-generering
|
|
/okr:innboks ──→ scripts/innboks-ingest.mjs (convert → split → frontmatter → per-doc gate → relations → index)
|
|
/okr:export ──→ scripts/export-pdf.py (weasyprint, documented prerequisite)
|
|
/okr:freshen-references ──→ (inline KB-evaluator + currency-polling via WebSearch/Task)
|
|
/okr:help ──→ (inline command/agent/workflow overview)
|
|
SessionStart ──→ coaching-hook.mjs (proactive coaching)
|
|
UserPromptSubmit ──→ inject-okr-context.mjs (core profile + resolved index.md pointer)
|
|
okr-second-brain-search (skill) ──→ Glob/Read/Grep over .claude/okr/ + ~/.claude/okr/org/ (on-demand retrieval)
|
|
```
|