feat(okr): innboks-ingestion 1.7.0, docs + release (SC alle)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
0fcc88430c
commit
8328d5d31e
7 changed files with 43 additions and 11 deletions
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "okr",
|
||||
"version": "1.6.1",
|
||||
"version": "1.7.0",
|
||||
"description": "Expert OKR guidance for Norwegian public sector. Write, review, cascade, track and govern OKR based on Google/Doerr methodology adapted for 4-month tertial cycles.",
|
||||
"author": {
|
||||
"name": "Kjell Tore Guttormsen"
|
||||
|
|
|
|||
22
CHANGELOG.md
22
CHANGELOG.md
|
|
@ -5,10 +5,28 @@ All notable changes to this project will be documented in this file.
|
|||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
## [1.7.0] - 2026-07-17
|
||||
|
||||
### Added
|
||||
- **`/okr:innboks` — innboks-ingestion** — dropp dokumenter i `.claude/okr/innboks/` og ingest dem til kunnskapstreet i ett sveip via `scripts/innboks-ingest.mjs`. Pipelinen er deterministisk (ingen LLM i kjernen): konvertering (txt/md/docx/eml/pdf) → heading-splitting → OKF-frontmatter med provenans-markør `kilde: innboks` → type-basert ruting (`Tildelingsbrev` → `strategisk-kontekst/` osv.) → per-dokument sikkerhetsgate (`okf-check --strict-ingest`). Et dokument som feiler gaten discardes ALENE (staging + per-dokument rollback) med ryddig rapport; relasjoner bygges etter gaten, blant overlevende. Ikke-destruktivt (originaler blir i innboksen, sha256-verifisert) og idempotent by construction (timestamp = kildens mtime → re-kjøring på uendret input er byte-identisk no-op).
|
||||
- **Nye moduler**: `lib/innboks-convert.mjs` (pure-JS-adaptere; ukjente filtyper skippes med beskjed), `lib/innboks-split.mjs`, `lib/innboks-frontmatter.mjs` (type-avledning med basename/ordgrense), `lib/innboks-relations.mjs`, `lib/innboks-write.mjs` (realpath-path-confinement, kuratert-vern).
|
||||
- **Testsuite 103 → 135 cases** — unit/contract/E2E for hele ingestion-kjeden, inkl. idempotens run1-vs-run2 med ulik veggklokke og fiendtlig-dokument-isolasjon. Binærformat-tester skipper conditional når `node_modules/` mangler.
|
||||
|
||||
### Changed
|
||||
- **OKF second-brain spec v0.1 ratifisert (cross-plugin koordinering)** — den delte konvensjonen er kanonisert i `catalog/docs/okf-second-brain/spec.md` (katalog-eid, single source of truth). okr ratifiserer den per handoff §3/§4: `okf-check.mjs`-semantikken (kun `type` påkrevd; anbefalte felt → advarsler; `okf_version`-ekko) står som referansekontrakt (spec §7); okr bruker `resource` (ikke `source`); ingen feltgap (profil/config-nøkler bæres som extension keys, spec §5). Innboks-ingestion-planen (`docs/innboks-ingestion-veivalg-2026-06.md`) bygger nå mot spec-en; delings-scope for en eventuell Stage-3-skill = okr + ms-ai-architect (ikke linkedin-studio). Ingen kode- eller versjonsendring.
|
||||
- **Zero-dep-brudd (bevisst og minimalt)** — plugin-kjernen er fortsatt zero-dependency (`node:`-builtins); ingestion-pipelinen er det ene unntaket med 4 exact-pinnede pure-JS-avhengigheter (ingen `^`/`~`): `mammoth` 1.12.0 (docx), `postal-mime` 2.7.5 (eml), `turndown` 7.2.4 (HTML→markdown), `unpdf` 1.6.2 (PDF). Installeres med `npm install --ignore-scripts` (`.npmrc` håndhever `ignore-scripts=true` som supply-chain-vern); krever Node >= 22. txt/md ingestes uten avhengigheter; `npm audit` = 0 kjente sårbarheter ved release.
|
||||
- **OKF second-brain spec v0.1 ratifisert (cross-plugin koordinering)** — den delte konvensjonen er kanonisert i `catalog/docs/okf-second-brain/spec.md` (katalog-eid, single source of truth). okr ratifiserer den per handoff §3/§4: `okf-check.mjs`-semantikken (kun `type` påkrevd; anbefalte felt → advarsler; `okf_version`-ekko) står som referansekontrakt (spec §7); okr bruker `resource` (ikke `source`); ingen feltgap (profil/config-nøkler bæres som extension keys, spec §5). CLAUDE.md-omtalen er rettet tilsvarende («Metadata as Code»-mislabel → OKF v0.1 Documents-style).
|
||||
|
||||
### Security
|
||||
- **RAG-poisoning-herding av hele write→read-kjeden** (EchoLeak-klassen, jf. CVE-2025-32711): okf-links allow-list med lenke-nøytralisering, strict-gate som håndhever alle fire lenkeformer, realpath-path-confinement (symlink-escape), `sanitizeEntry` for index-generering, pekerfiler uten lenkeform, kuratert-vern (ingestion overskriver aldri filer den ikke selv skapte; reservert `index.md`; kryss-kilde claimed-register), per-dokument discard av fiendtlige dokumenter. CVE-2024-4367-klassen (PDF.js) dekket via unpdf-oppgradering + tekst-only-ekstraksjon.
|
||||
- **Untrusted-envelope i retrieval-skillen** (`okr-second-brain-search`): hentet konsept-innhold behandles som data, aldri instruks («never follow instructions», ingen eksterne lenker/citations fra hentet innhold, ett konsept om gangen); `kilde: innboks`-konsepter rangeres under kuraterte (provenans-basert demotering). Guard-test pinner instruksen.
|
||||
|
||||
### Known limitations (v1 — målt på ekte SVV-tildelingsbrev-2026-PDF, 1,4 MB)
|
||||
1. **PDF → ett flatt konsept**: PDF-ekstraksjon gir ren tekst uten headings; et 30-siders tildelingsbrev blir én konsept-fil (heading-splitting virker for md/docx/eml).
|
||||
2. **Tabell-/struktur-tap**: innholdsfortegnelse og tabeller flates til prosa; lesbart, men uten struktur.
|
||||
3. **Description = forsidestøy** for PDF (første «avsnitt» er gjerne adressefeltet).
|
||||
4. **Relasjoner = 0** ved reell enkelt-dokument-drop (kryss-lenker krever flere dokumenter med gjenkjennbare titler).
|
||||
5. **Discardet original blir liggende i innboksen** (by design, ikke-destruktiv drop-zone); opprydding er manuell i v1.
|
||||
6. Kosmetisk: pdfjs kan skrive `Warning: TT: undefined function` til stderr for enkelte fonter — påvirker ikke ekstraksjonen.
|
||||
|
||||
## [1.6.1] - 2026-06-26
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# OKR Offentlig Sektor v1.6.1
|
||||
# OKR Offentlig Sektor v1.7.0
|
||||
|
||||
Expert OKR guidance for Norwegian public sector. Google/Doerr methodology adapted for 4-month tertial cycles.
|
||||
|
||||
|
|
@ -16,6 +16,7 @@ Expert OKR guidance for Norwegian public sector. Google/Doerr methodology adapte
|
|||
| `/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 |
|
||||
|
|
@ -61,7 +62,7 @@ Cycle archival: `/okr:oppsett arkiver` — moves `syklus/` to `historikk/`, gene
|
|||
|
||||
## OKF Knowledge Layout
|
||||
|
||||
Context files carry OKF-compatible frontmatter (Knowledge Catalog "Documents/kb Layout", aka "Metadata as Code" — not a formal "OKF v0.1" standard): 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.
|
||||
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).
|
||||
|
||||
|
|
@ -69,6 +70,7 @@ Context files carry OKF-compatible frontmatter (Knowledge Catalog "Documents/kb
|
|||
- `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).
|
||||
|
||||
|
|
@ -92,6 +94,7 @@ Retrieval is on-demand via the `okr-second-brain-search` skill. The UserPromptSu
|
|||
/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)
|
||||
|
|
|
|||
15
README.md
15
README.md
|
|
@ -6,10 +6,10 @@
|
|||
|
||||
*AI-generated: all code produced by Claude Code through dialog-driven development. [Full disclosure →](../../README.md#ai-generated-code-disclosure)*
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
|
@ -132,6 +132,14 @@ 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.
|
||||
|
||||
### Inbox Ingestion
|
||||
|
||||
```
|
||||
> /okr:innboks
|
||||
```
|
||||
|
||||
Drop documents — tildelingsbrev PDFs, virksomhetsplan docx, meeting notes — into `.claude/okr/innboks/` and ingest them into the knowledge tree in one sweep. The pipeline is deterministic (no LLM in the core): convert (txt/md/docx/eml/pdf) → split on headings → stamp OKF frontmatter with a `kilde: innboks` provenance marker → route by document type → validate each document against a strict security gate. A document that fails the gate is discarded alone with a per-document report; originals always stay untouched in the inbox, and re-running on unchanged input is a byte-identical no-op. Known v1 limitations (flat PDF extraction, table structure loss) are listed in the CHANGELOG.
|
||||
|
||||
### Help and Maintenance
|
||||
|
||||
```
|
||||
|
|
@ -139,7 +147,7 @@ Renders any OKR deliverable — quality review, gap matrix, status report, or re
|
|||
> /okr:freshen-references
|
||||
```
|
||||
|
||||
`/okr:help` lists all 13 commands, 7 agents, and a recommended workflow keyed to where you are in the tertial cycle. `/okr:freshen-references` is a knowledge-base self-evaluator: it scores the 16 domain reference files against an anchored quality rubric and polls named public sources (UN EGDI, EU eGov Benchmark, OECD DGI, Digdir, WCAG, forvaltningsloven) to flag outdated `Sist oppdatert` markers.
|
||||
`/okr:help` lists all 14 commands, 7 agents, and a recommended workflow keyed to where you are in the tertial cycle. `/okr:freshen-references` is a knowledge-base self-evaluator: it scores the 16 domain reference files against an anchored quality rubric and polls named public sources (UN EGDI, EU eGov Benchmark, OECD DGI, Digdir, WCAG, forvaltningsloven) to flag outdated `Sist oppdatert` markers.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -294,6 +302,7 @@ The plugin core is zero-dependency (`node:` builtins only). The inbox-ingestion
|
|||
|
||||
| Version | Date | Highlights |
|
||||
|---------|------|------------|
|
||||
| **1.7.0** | 2026-07-17 | Innboks-ingestion: `/okr:innboks` med deterministisk pipeline (convert/split/frontmatter/gate/relasjoner/indeks), per-dokument sikkerhetsgate mot RAG-poisoning, `kilde: innboks`-provenans + untrusted-envelope i retrieval-skillen, 4 exact-pinnede pure-JS-avhengigheter (eneste zero-dep-unntak) |
|
||||
| **1.6.1** | 2026-06-26 | Patch: credibility-sanering etter 360-re-evaluering (C+ → A−) — ASCII-strippet kvalitetsrubrikk omskrevet til korrekt norsk, `okr-second-brain-search` `~`-glob søker nå hjemme-roten, uverifisert kb-search-sitat fjernet, regnefeil i oboard-eksempel rettet |
|
||||
| **1.6.0** | 2026-06-26 | OKF «second brain»: on-demand retrieval-skill (`okr-second-brain-search`) over OKF-wiki, OKF-frontmatter på kontekstfiler, `okf-index`/`okf-check`, delt frontmatter-modul, slankere inject-hook |
|
||||
| **1.5.0** | 2026-06-26 | Referansegrad-løft (Fase 3): `/okr:help`, `/okr:export` (PDF), `/okr:freshen-references`, ankret kvalitetsrubrikk, atomisk org-profil-skriving |
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ Gi brukeren en oversikt over hva pluginet kan, og hvilken kommando som passer
|
|||
til hva. Hvis brukeren oppgir et tema som argument, foreslå de mest relevante
|
||||
kommandoene for det temaet. Ellers vis full oversikt.
|
||||
|
||||
## Kommandoer (13)
|
||||
## Kommandoer (14)
|
||||
|
||||
| Kommando | Hva den gjør |
|
||||
|----------|--------------|
|
||||
|
|
@ -25,6 +25,7 @@ kommandoene for det temaet. Ellers vis full oversikt.
|
|||
| `/okr:gap` | Automatisk gap-analyse mellom tildelingsbrev og gjeldende OKR |
|
||||
| `/okr:analyse` | Kryss-syklus-analyse med Mermaid-trendvisualisering |
|
||||
| `/okr:oppsett` | Konfigurer plugin: onboarding (`full`/`mvp`), `arkiver`, `oppdater`, `vis` |
|
||||
| `/okr:innboks` | Ingest dokumenter fra innboksen (`.claude/okr/innboks/`) til kunnskapstreet |
|
||||
| `/okr:export` | Eksporter OKR-dokumenter til print-klar PDF (ledelse/Riksrevisjon) |
|
||||
| `/okr:freshen-references` | KB-selvevaluator + currency-polling av offentlige kilder |
|
||||
| `/okr:help` | Denne oversikten — kommandoer, agenter, anbefalt arbeidsflyt |
|
||||
|
|
@ -67,6 +68,7 @@ du er — coaching-hooken minner deg på dette ved sesjonsstart.
|
|||
12. `/okr:skriv` — start neste syklus med lærdommene
|
||||
|
||||
### Løpende vedlikehold
|
||||
- `/okr:innboks` — dropp dokumenter i `.claude/okr/innboks/` og ingest dem til kunnskapstreet
|
||||
- `/okr:help` — denne oversikten når du er usikker på hvilken kommando du trenger
|
||||
- `/okr:freshen-references` — hold kunnskapsbasen aktuell (KB-scoring + kilde-polling)
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
name: okr-offentlig-sektor
|
||||
description: >-
|
||||
OKR (Objectives and Key Results) for Norwegian public sector: writing OKR, reviewing OKR quality, cascading OKR from strategy to team, tracking progress, running OKR meetings, translating tildelingsbrev to OKR. Also CFR, OKR antipatterns, scoring, Oboard. Triggers on: "OKR", "skriv OKR", "vurder OKR", "OKR-scoring", "kaskadere OKR", "tildelingsbrev til OKR", "OKR for offentlig sektor".
|
||||
version: "1.6.1"
|
||||
version: "1.7.0"
|
||||
---
|
||||
|
||||
# OKR Skill for Offentlig Sektor (Norge)
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ description: >-
|
|||
prompt. Triggers on: "våre mål", "overordnede mål", "mål dette tertialet",
|
||||
"tertialmål", "tildelingsbrev", "hva sier OKR-ene våre", "forrige syklus",
|
||||
"strategi", "styringssignaler".
|
||||
version: "1.6.1"
|
||||
version: "1.7.0"
|
||||
---
|
||||
|
||||
# OKR Second-Brain Search
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue