docs(plan): utrulling D-F–D-I — sesjonsplan (D-F–D-I i §2, S3.5/S3.6/S5.4, graf+T0), roadmap-revisjonsblokk, commons-amendment-utkast (Step-1-analyse: NEI → minimal amendment), toolkit-repo-brief

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0145ZKPLMVeqM47z2jxxokym
This commit is contained in:
Kjell Tore Guttormsen 2026-07-15 05:29:41 +02:00
commit 12e7f6aabc
5 changed files with 889 additions and 7 deletions

View file

@ -3,6 +3,10 @@
> **Status:** GJELDENDE sesjonsplan. Forfattet som re-plan-forslag av kryssmodell-reviewen
> 2026-07-09 (Fable 5); **promotert til gjeldende plan 2026-07-10 på operatør-instruks.**
> Roadmapen (`2026-07-06-reell-kjoring-analyse-plan.md`) er revidert med kryssreferanser hit.
> **Revidert 2026-07-14:** beslutningene D-FD-I (kunnskapsinnholdsmodell, OKF-modul/fabrikk/evaluator,
> oppsett/brukervennlighet, verdibevis/kostnadsstyring) ble truffet i operatør-samtale og er flettet inn
> her (§2-oppføringer + nye sesjoner S3.5/S3.6/S5.4 + S5.3-utvidelse); fasit i
> [revisjonspakke D-FD-I](../2026-07-14-revisjonspakke-DF-DI.md).
> Funn-referanser (F1F14, P1P6, U-1U-4) peker til [reviewen](../review-2026-07.md).
> **Beslutnings-sesjonene D-AD-E er fortsatt ÅPNE (operatør-kø):** bygg-sesjoner gated på dem
> starter ikke før beslutning foreligger; **S2.0/S2.1/S2.5 er byggbare NÅ** (ingen
@ -85,6 +89,59 @@ UTENFOR dette repoets sesjoner; flagges i hver berørt sesjon.
---
**D-FD-I — BESLUTTET 2026-07-14** (operatør-samtale, intensjonsanalyse). Til forskjell fra D-AD-E
over er disse fire allerede avgjort; fasit-protokoll + innplassering i
[revisjonspakke D-FD-I](../2026-07-14-revisjonspakke-DF-DI.md). Frosne dokumenter er IKKE endret ennå
— amendments skjer via commons (PULL-ONLY) i egne økter. Oppføringene under oppsummerer beslutningen +
hva den blokkerer/åpner (ikke hele fasiten).
### D-F — Kunnskapsinnholdsmodell `[BESLUTTET 2026-07-14]`
- **Status:** BESLUTTET 2026-07-14. Fasit: [revisjonspakke §1](../2026-07-14-revisjonspakke-DF-DI.md).
- **Kjerne:** ny delt innholdsmodell i commons (kunnskapstyper tiltaksmønstre/erfaringsnotater/faglige
råd, alle med påkrevd kildebelegg) — KUN lesestoff for forslagsstilleren, validatorens regler urørt.
Streng separasjon fra dommene (bibliotek via `bundle_context`; korreksjoner KUN via ExpeL-folden).
Delt dimensjonsbibliotek materialiseres inn i hver bundle via ingest-mønsteret (`generated: true`,
flat navigasjon — ikke kryssbundle-lenker); dimensjonskatalog som skjema-validert konfig; trinnvis
lesing (sammendrag-først) er nytt krav.
- **Blokkerer/åpner:** gated på commons-amendment FØRST (PULL-ONLY; D7-speiling flagges) → åpner
**S3.5** (koordineres med S3.2). Realistisk energi-innhold (§1 pkt. 7) = egen senere innholds-
produksjonsjobb, ikke del av S3.5. Fabrikk-avhengige deler venter på toolkit-repoet (D-G).
### D-G — OKF: felles modul, fabrikk, evaluator `[BESLUTTET 2026-07-14]`
- **Status:** BESLUTTET 2026-07-14. Fasit: [revisjonspakke §2](../2026-07-14-revisjonspakke-DF-DI.md)
(+ kryssrepo-inventar §0.2).
- **Kjerne:** standard-kompatibel OKF (F4/`/`-lenkeformen rettes — forsterker **D-A pkt. 3**), egne
utvidelser dokumenteres eksplisitt som utvidelser. **Felles OKF-kode JA** (endrer D7s «from spec
alone» bevisst; gir Claude-repoet skrive-halvdelen A2 mangler i dag). Nytt tredje signatur-repo
(arbeidstittel `okf-toolkit`): delt les/naviger/skriv-kjerne + conformance-testsett + bundle-evaluator
+ bundle-fabrikk. Rekkefølge: modul + formatprøve først (fjerner 6-steders-duplikasjonen), fabrikk +
evaluator deretter mot energi-caset.
- **Blokkerer/åpner:** toolkit lever i EGET repo utenfor denne sesjonskøen → **ekstern avhengighet (T0)**
som blokkerer fabrikk-avhengige deler av D-F/D-H. Guard forblir eget sikkerhets-repo (avhengighet).
### D-H — Oppsett og brukervennlighet `[BESLUTTET 2026-07-14]`
- **Status:** BESLUTTET 2026-07-14. Fasit: [revisjonspakke §3](../2026-07-14-revisjonspakke-DF-DI.md).
- **Kjerne:** oppsett gjøres ALLTID av et lite team (teknisk + fag); leveransen er en **oppskrift**
(dokumentert prosess), ikke en veiviser (B9-onboarding + guidet dom-kommando FORKASTET). Fagpersonen
leverer filer i egne formater — aldri skjema/JSON; **fabrikken** (D-G) AI-oversetter fri-format-dommer
til strengt format, godkjenning i praksis = stikkprøver med provenance-peker til ekspertens originalfil.
Demo-sti: klon → unzip energi-eksempel i bundle-innboks → fabrikk bygger → hele sløyfa kjører.
Obsidian/VS Code som lese-løsning først.
- **Blokkerer/åpner:** oppskrift-dokumentet (§3 pkt. 1) legges til **S5.3** som dokumentleveranse;
dom-oversettelse + demo-sti er fabrikk-avhengige (D-G/T0), blokkert til toolkit finnes.
### D-I — Verdibevis + kostnadsstyring `[BESLUTTET 2026-07-14]`
- **Status:** BESLUTTET 2026-07-14. Fasit: [revisjonspakke §4](../2026-07-14-revisjonspakke-DF-DI.md).
- **Kjerne:** publiserings-påstand = **nivå 2** (realistisk case, modellerte tall, aldri salgsspråk over
beleggsnivået); nivå 3 (ekte pilot) er åpen invitasjon. **Verdirapport per kjøring** (kjerne):
hovedbok-basert modellert→korrigert→realisert, målprogresjon, tallfestet læringseffekt, kost-mot-verdi.
**Kostnadssimulering FØR kjøring** (MÅ-krav): what-if over modell-mappet (modeller × effortnivåer),
prisdata som skjema-validert konfig (aldri hardkodet), kvalitetsutsagn merket som veiledning med kilde.
- **Blokkerer/åpner:** åpner **S5.4** (verdirapport, etter S2.1-outbox + ledger) og **S3.6**
(kostnadssimulering, fri/offline). README oppdateres FØRST når nivå-2-beviset finnes (pkt. 1).
---
## 3. Opus-sesjons-specs (offline, autonome)
> Felles for alle: Iron Law (failing test først); `uv run pytest` / `uv run ruff check .` /
@ -283,6 +340,68 @@ UTENFOR dette repoets sesjoner; flagges i hver berørt sesjon.
(klient-mock som teller kall — kallet skal ALDRI skje).
- **Verifisering:** nye tester grønne + detach → rød; full gate grønn.
### S3.5 `[NY]` Innholdsmodell + fagbibliotek-materialisering (D-F; gated: commons-amendment)
- **Mål:** delt kunnskapsinnholdsmodell (tiltaksmønstre/erfaringsnotater/faglige råd med kildebelegg)
materialiseres inn i prosjekt-bundles som rent lesestoff for forslagsstilleren — uten å røre
validatoren og uten å blande seg med dommene.
- **Scope (revisjonspakke §1 pkt. 16):** (1) nye kunnskapstyper i delt spec (commons-amendment FØRST —
PULL-ONLY, D7-speiling flagges); (2) dimensjonskatalog som skjema-validert konfig (id, label,
allowed_measure_types, allowed_code_prefixes) + fail-fast loader — rammeverket shipper eksempel-katalog,
deployer eier sin; (3) bibliotek-materialisering via ny ingest-kildefamilie (`generated: true`,
manifest-ref, re-materialisering eier egne filer — flat/same-dir navigasjon, IKKE kryssbundle-lenker,
IKKE manuell duplisering); (4) trinnvis lesing i `bundle_context`: sammendrag-først (én linje per
kunnskapsfil), fulltekst hentes ved behov. Streng separasjon håndheves: bibliotek via `bundle_context`,
organisasjonens korreksjoner KUN via ExpeL-folden. **IKKE i scope:** energi-innholdet i realistisk skala
(§1 pkt. 7 = egen senere innholds-produksjonsjobb, avhengig leveranse); validator↔bibliotek-kobling
(framtidig beslutning); toolkit-fabrikken (D-G, eget repo).
- **Avhengigheter:** commons-amendment for innholdsmodellen (D-F-utkast operatør-godkjent + `git subtree
pull`) FØRST; koordineres med **S3.2** (multi-kandidat — deler seed/frontmatter-stien). Etter
S2.0/S2.1/S2.5.
- **Filer:** `okf.py` (trinnvis lesing / sammendrag-seam — MAF-fri, håndhevet av `test_okf_is_maf_free`),
ny `dimension_catalog.py` (loader, fail-fast), `ingest.py` (bibliotek-kildefamilie), commons-spec +
eksempel-katalog (i commons — flagg), repo-lokal bibliotek-fixture under `data/`, nye tester.
- **TDD:** (1) RØD: dimensjonskatalog med ugyldig felt (ukjent `allowed_measure_type`-referanse) →
fail-fast ved lasting — detach-punkt: fjern skjema-valideringen → passerer → rød; (2) RØD: materialisert
bibliotek-fil når forslags-prompten via `bundle_context` (markør fraværende fra bundelen ellers) —
detach materialiseringen → markøren forsvinner → rød; (3) RØD: trinnvis lesing gir sammendraget i
navigert kontekst men IKKE fulltekst før eksplisitt henting — detach sammendrag-seamen → hele
fullteksten stuffes inn → rød; (4) RØD: en bibliotek-fil MÅ ALDRI nå hypotese-prompten via dom-kanalen
(separasjons-kontroll — biblioteket lekker aldri inn i ExpeL-folden).
- **Nøkkelantakelser:** trinnvis-lesing-kravet (D-F pkt. 6) kan realiseres uten å bryte method-spec §3
Steg 1s render-kontrakt — HVIS ikke, er sammendrag-seamen del av commons-amendmenten (flagges
eksplisitt, jf. revisjonspakke §6-nøkkelantakelsen). Bibliotek-fixture ligger repo-lokalt under `data/`
(aldri i `shared/`) til energi-innholdet materialiseres.
- **Verifisering:** nye tester grønne + hvert detach-punkt → rød; `test_okf_is_maf_free` utvidet grønn;
full suite + ruff + mypy grønne. **Flagg:** commons-amendment + D7-speiling (egen sesjon i søsken-repoet).
### S3.6 `[NY]` Kostnadssimulering før kjøring (D-I pkt. 3; offline, ikke gated)
- **Mål:** operatøren ser estimert kost for en portefølje-kjøring FØR den startes — what-if over
modell-mappet (modeller × effortnivåer) — så kjøringskost blir en informert beslutning, ikke en
overraskelse etterpå.
- **Scope (revisjonspakke §4 pkt. 3):** `python -m portfolio_optimiser.costsim` (+ funksjons-API):
estimér tokens/kost for en gitt portefølje under valgt modell + effortnivå; **prisdata som skjema-
validert konfig** (kr/1k tokens per modell, med kilde- + dato-felt — ALDRI hardkodet; fail-fast ved
manglende/ugyldig pris); kvalitets-avveininger per modellvalg merket som **veiledning med kilde**, aldri
målt fakta uten belegg; output = estimat-tabell (per rolle/modell/effort) + `kost-mot-verdi`-felt klart
for verdirapporten (S5.4). Deler tak-begreper med budsjettmaskineriet (`PortfolioBudget` /
`BudgetMiddleware` fra S3.4), men estimerer FØR kall. Adopsjonssti dokumenteres (start liten → eskaler
med tilliten). IKKE: live prisoppslag (nettverk), faktisk modellkall (rent offline), kvalitets-benchmarking.
- **Avhengigheter:** ingen commons-avhengighet (offline, stack-lokalt); drar nytte av **S3.4**
(budsjett-typer) og mater **S5.4** (verdirapport). Kan bygges før S3.5.
- **Filer:** ny `costsim.py` (ren stdlib + pydantic — MAF-fri, legg i `_MAF_FREE_MODULES`),
`data/pricing.example.json` (skjema + eksempelpriser med kilde/dato), `budget.py` (deling av
tak-begreper), nye tester.
- **TDD:** (1) RØD: konfig uten pris for en modell i mappet → fail-fast «missing price for <modell>» —
detach-punkt: fjern pris-valideringen → estimatet gjettes → rød; (2) RØD: estimatet er deterministisk og
skalerer med modell × effort (to modeller, samme portefølje → forskjellig, reproduserbart estimat) —
detach effort-faktoren → identisk estimat → rød; (3) RØD: hardkodet pris i kildekode fanges av
grep-guard (pris MÅ komme fra konfig).
- **Nøkkelantakelser:** token-estimatet kan bygges fra portefølje-formen (antall prosjekter × runder ×
tak) uten et modellkall — deterministisk øvre-grense-estimat, ikke prediksjon; merkes eksplisitt som
estimat i output.
- **Verifisering:** nye tester grønne + detach → rød; `uv run python -m portfolio_optimiser.costsim` gir
estimat-tabell uten nettverk (grep-guard: ingen socket-sti i modulen); full gate grønn.
### S4.0 `[NY]` Validator-forankring mot kostbaseline (F3, F8; gated: D-A pkt. 2)
- **Mål:** `affected_items` avstemmes fail-closed mot prosjektets faktiske kostbaseline — den
deterministiske gaten kan ikke lenger mates med hallusinerte kostlinjer.
@ -359,12 +478,43 @@ UTENFOR dette repoets sesjoner; flagges i hver berørt sesjon.
- **Scope:** `main()` (+ evt. `portfolio`-subkommando): `--dimension-config`, `--ledger`,
`--goals`, `--bundle-dir`, `--verdict-dir`, `--outbox-dir`; README/extending.md/CHANGELOG-sync;
ærlighets-grep (ingen «learning loop»-claims på stier uten fold).
- **Scope (D-H pkt. 1, tillegg):** oppsett-**oppskrift** som dokumentleveranse — dokumentert team-prosess
(teknisk + fag) for å bygge en kunnskapsbase, med ærlig README-forventning (en god base tar 12 uker
dedikert arbeid; kvaliteten på investeringen avgjør resultatet); IKKE en veiviser / B9-onboarding-
intervju (FORKASTET).
- **Avhengigheter:** S2.0, S2.1 (og drar nytte av alt over).
- **Filer:** `run.py`, `README.md`, `docs/extending.md`, `CHANGELOG.md`, CLI-tester.
- **TDD:** RØD: CLI-kjøring med goals+ledger på fixtures → GoalReached-stopp observerbar i output.
- **Verifisering:** CLI-tester grønne; full gate grønn; manuell `uv run python -m
portfolio_optimiser.run …`-røyk på fixtures dokumentert i STATE.
### S5.4 `[NY]` Verdirapport per kjøring (D-I pkt. 2)
- **Mål:** hver kjøring (og porteføljepass) produserer en deterministisk verdirapport —
modellert → ekspert-korrigert → realisert per prosjekt/dimensjon, målprogresjon, tallfestet
læringseffekt og kost-mot-verdi — som artefakt, uten et eneste modellkall.
- **Scope (revisjonspakke §4 pkt. 2):** hovedbok-basert rapportgenerator over ledgeren + outbox (S2.1):
(a) besparelses-kolonner modellert/korrigert/realisert per prosjekt + dimensjon; (b) målprogresjon mot
GoalContract; (c) **læringseffekt tallfestet** — godkjenningsandel per kjøring + om modellert-vs-
forventet-gapet krymper over kjøringer; (d) **kost-mot-verdi** («kjøringen kostet X, identifiserte
kvalitetssikret modellert besparelse Y» — X fra S3.6-estimat / faktisk token-forbruk). Rapport =
deterministisk artefakt (JSON + markdown-render; sort_keys / indent / LF / byte-stabil). Ærlighet:
realiserte tall KUN der dom finnes; modellerte merkes som modellert (aldri salgsspråk over
beleggsnivået, D-I pkt. 1). IKKE: web-dashboard, live-oppdatering, modellkall.
- **Avhengigheter:** **S2.1** (outbox — forslag/utfall-artefakter) + ledger (S2.0-læringssløyfe);
konsumerer **S3.6**-kostestimat for kost-mot-verdi-feltet.
- **Filer:** ny `valuereport.py` (ren stdlib + pydantic — MAF-fri, `_MAF_FREE_MODULES`), `run.py`
(opt-in `--value-report`), nye tester.
- **TDD:** (1) RØD: to kjøringer med økende godkjenningsandel → læringseffekt-metrikken stiger og
gap-krympingen rapporteres — detach-punkt: fjern gap-beregningen → flat/feil → rød; (2) RØD: prosjekt
uten dom → «realisert» er tomt/umerket, ALDRI lik modellert — detach ærlighets-grensen →
realisert = modellert → rød; (3) RØD: byte-determinisme (samme ledger + outbox → identisk rapport,
`diff`).
- **Nøkkelantakelser:** ledgeren + outbox bærer allerede alt rapporten trenger (modellert fra proposal,
korrigert/realisert fra dommene, kost fra token-forbruk / S3.6) — rapporten er ren projeksjon, ingen ny
tilstand (test: bygg rapport fra committede fixtures uten kjøring).
- **Verifisering:** nye tester grønne + detach → rød; `run.py --value-report` på fixtures gir byte-stabil
rapport uten nettverk; full gate grønn.
---
## 4. Operatør-gatede milepæler (IKKE autonome Opus-sesjoner)
@ -406,6 +556,8 @@ flowchart TB
S31["S3.1 semantisk henting"]; S32["S3.2 multi-kandidat (F5)"]; S33["S3.3 concurrent (F6)"]; S34["S3.4 kost på tvers (F10)"]
S40["S4.0 kostbaseline-forankring (F3)"]; S41["S4.1 preflight"]; S42["S4.2 live-drill"]
S51["S5.1 ruting/sporing"]; S52["S5.2 varsling"]; S53["S5.3 CLI-paritet"]
S35["S3.5 innholdsmodell/bibliotek (D-F)"]; S36["S3.6 kostnadssimulering (D-I)"]; S54["S5.4 verdirapport (D-I)"]
DFC["D-F commons-amendment (PULL-ONLY)"]; T0[["T0 toolkit-repo (eget repo — okf-toolkit)"]]
M1{{"M1 tenant+smoke"}}; M2{{"M2 første live-kjøring"}}; M3{{"M3 pilot"}}
DA --> S27; DA --> S32; DA --> S40
@ -415,6 +567,9 @@ flowchart TB
S41 --> M1; S40 --> M2; S42 --> M2; M1 --> M2
S51 --> S52; S20 --> S53; S21 --> S53
S33 --> M3; S34 --> M3; S52 --> M3; M2 --> M3; S31 --> M3; S32 --> M3
DFC --> S35; S32 -. koordineres .-> S35
S21 --> S54; S34 -. kost .-> S54; S36 -. kost-mot-verdi .-> S54
T0 -. fabrikk .-> M3
```
**Anbefalt sesjonssekvens** (parallellitet mulig der grafen tillater; én fase = Voyage-syklus):
@ -422,10 +577,18 @@ flowchart TB
1. **D-A, D-B** (kan tas i samme operatør-bolk; D-C/D-D/D-E kan vente)
2. **S2.0 → S2.1 → S2.5** (ingen beslutnings-avhengighet — kan starte FØR/parallelt med D-runden)
3. **S2.7** (etter D-A + commons-pull) · **S2.2 → S2.3 → S2.4** (etter D-B)
4. **D-C, D-D, D-E** → **S3.1 → S3.2 → S3.4 → S3.3**
4. **D-C, D-D, D-E****S3.1 → S3.2 → S3.4 → S3.3**; **S3.5** etter D-F commons-amendment +
koordinert med S3.2; **S3.6** fritt (offline, når som helst — mater S5.4)
5. **S4.1** (når som helst) → **M1** (operatør) · **S4.0 → S4.2****M2** (operatør)
6. **S5.1 → S5.2 → S5.3****M3** (operatør; krever også D-B-amendment + ekte ekspert)
6. **S5.1 → S5.2 → S5.3** · **S5.4** etter S2.1 + ledger → **M3** (operatør; krever også
D-B-amendment + ekte ekspert + toolkit-fabrikken T0)
**Offline-fullførings-grensen** går etter S5.3: alt over den linjen er gratis, autonomt og
load-bearing-testbart; M1M3 er de eneste stegene som koster penger, krever tenant eller krever
et menneske.
**Ekstern avhengighet (T0 toolkit-repo, eget repo — `okf-toolkit`, D-G):** delt OKF-modul + conformance
+ bundle-evaluator + bundle-fabrikk lever i sitt eget signatur-repo, utenfor denne sesjonskøen.
Fabrikk-avhengige deler av D-F/D-H (realistisk energi-innhold via fabrikken, ekspert-dom-oversettelse,
demo-sti, M3-pilot) er blokkert til T0 finnes; S3.5/S3.6/S5.4 er valgt slik at de IKKE er fabrikk-gatede.
**Offline-fullførings-grensen** går etter S5.3/S5.4: alt over den linjen er gratis, autonomt og
load-bearing-testbart (også de nye S3.5/S3.6/S5.4). To ikke-autonome forbehold blant det nye: S3.5s
commons-amendment (operatør-godkjenning + PULL-ONLY) og T0 toolkit-repoet (eget repo). M1M3 er fortsatt
de eneste stegene som koster penger, krever tenant eller krever et menneske.