docs(ms-ai-architect): sesjonsplan flyttet ut av public repo — planer holdes internt [skip-docs]

This commit is contained in:
Kjell Tore Guttormsen 2026-07-10 06:51:36 +02:00
commit 4794de0b79
2 changed files with 0 additions and 229 deletions

View file

@ -1,228 +0,0 @@
# Plugin-roadmap: sesjonsplan R0R22 (2026-07)
_Styrende sesjonsplan for ms-ai-architect fra 2026-07-02, basert på full statusanalyse (visjon/planer, ground-truth-audit m/testkjøring, Spor 1-planlesing). Erstatter IKKE eksisterende planer (korrekthetsprogrammet, Spor 1-planen, briefer) — **sekvenserer** dem og fyller hullene analysen avdekket. Operatør-detaljer som ikke hører hjemme i repoet ligger i en LOCAL-ONLY-annex (`.claude/projects/2026-07-02-helhetlig-roadmap/`)._
**Status 2026-07-02:** måle-/hardningsfasen av korrekthetsprogrammet er ferdig (judge v3.1 P100/R100, alle §8-gap lukket, suite 641/641, alle skills ≥90) — men mekanismen er dormant til Spor 1 kjøres. Gapet mellom visjon («reference-filene 100 % til å stole på» som prosessgaranti) og realitet er nøyaktig de ueksekverte sporene under.
**Status 2026-07-09/10:** uavhengig kryssmodell-review (annen modell enn den som skrev pluginen; read-only) gjennomført over 5 akser med primærkilde-verifisering. Resultat: 7 BLOCKER + 15 MAJOR (full rapport + detaljerte sesjon-specs i LOCAL-ONLY `.claude/projects/2026-07-09-crossmodel-review/`). Reviewen injiserte **RX-serien** (§RX under), skjerpet R7-gaten, krympet Enhet 4 og utvidet header-residualen. Baseline re-verifisert: suite 806/806, 389 refs, v1.17.0 konsistent, R0R6 + R20R22 ✅.
## Modelldirektiv
**Alle sesjoner i denne roadmapen + alle deres subagenter kjøres på Opus 4.8 med xhigh reasoning effort** (operatørbeslutning 2026-07-02). Aldri Sonnet/Haiku. Agent-tool: `model: "opus"`.
## Prinsipper
1. **Én sesjon = én fullført enhet:** hver sesjon avsluttes med suite grønn (exit-kode), commit + push, STATE.md overskrevet med neste sesjons-ID.
2. **Split-regel:** blir en sesjon for stor midtveis → fullfør en HEL delmengde (per skill / per batch), commit, la STATE peke på resten som egen sesjon. Aldri halvferdig tilstand.
3. **TDD Iron Law** for all produksjonskode; **aldri auto-fiks KB** (judge/audit flagger → menneske bekrefter mot kilde → fiks).
4. **Scope-fence:** sesjonens innhold er grensen; muligheter utover foreslås i sluttrapporten, utføres ikke.
5. **Provenans-regel (ny):** hvert tall som skrives i STATE/docs bærer scope + målemetode i én linje (analysen 2026-07-02 brukte en hel avstemmingsrunde på å re-utlede at «45» var non-advisor-scoped).
## Sekvens og avhengigheter
```
R0 (tillit+hygiene+klargjøring)
└─→ R1 → R2 → R3 → R4 (Spor 1 substrat via /trekexecute; release v1.17.0 i R4)
└─→ R5 (Spor 0-fiksing)
└─→ R6 (judge-pass brief+plan) → R7…R10 (korpus-pass; antall fastsettes i R6)
└─→ R11 (flag→fiks) → R12 (§7 fersk-gull — programmets sluttbevis)
└─→ R13 → R14 (S-Cosmo, sist i programmet)
└─→ R15 (skill-eval v2 plan) → R16+ (eksekvering)
Fleksible (uavhengige, kan interleaves): R17 (dekningsaudit), R18 (onboarding-uplift)
Ungated base-felt-pre-pass (⊥ R7, i R7-vente-vinduet): R20 (Category-backfill ✅ 2026-07-06) → R21 (Status/Last-updated not-due)
RX-serien (kryssmodell-review 2026-07-09, §RX — går FØRST i køen):
RX-REG → RX-REG-KB (12 økter) → RX-REG² (utløses av OJ-publisering)
RX-P1 → RX-P2 (plugin-korrekthet installert modus; ⊥ alt annet)
RX-OPS2 → { RX-KB1, Enhet 3b, Enhet 4 } → RX-HDR (driver-hardening FØR korpus-skriv; ⊥ R7)
R7-GATE SKJERPET: G6-LA ∧ RX-OPS1 ∧ RX-KB1
Parkert (eget operatør-go): OKF second brain (nå m/ swap-krav → S-OKF-1→3, se Parkert) · pris/unsourced-verifisering
```
---
## R0 — Tillit, dok-hygiene og Spor 1-klargjøring (kort økt)
**Mål:** fjern alt som kan villede fremtidige sesjoner eller svekke tillit, og gjør Spor 1-planen eksekverbar.
1. **Sanering:** fjern identifiserende personkontekst fra ett tracked dokument (utpekt i LOCAL-ONLY-annexen) + søk hele tracked-treet for samme mønster; historikk-håndtering = operatørbeslutning dokumentert i annexen.
2. **Utracket brief:** `docs/skill-validation-routine-brief-2026-07.md` — public-egnethetssjekk → commit (eller flytt til `.claude/projects/` hvis intern).
3. **CLAUDE.md:** rett de to stale pekerne → `skills/ms-ai-advisor/references/architecture/recommended-mcp-servers.md`.
4. **Tellinger:** fjern «398 inkl. plugin-nivå» overalt (plugin-nivå `references/` har aldri eksistert; 389 er totalen).
5. **Programdok:** §6-statustabell à jour med §8 (Spor 2a/2b/3 lukket 2026-06-30); historisk-merknad på 84,2-tallene i intro.
6. **Workflow-plan:** superseded-peker øverst → programdokumentet.
7. **development.md:** fjern «For Cosmo»-instruksen — produserer aktivt ny drift mot aldri-ny-Cosmo-regelen.
8. **STATE-korreksjoner:** registry-semantikk (2 disk-filer mangler *i* registry — ikke «stale cache»); Status-tall 31→29 (målt 2026-07-02, non-advisor); provenans-regelen innføres.
9. **P0-beslutninger (operatør, minutter):** velsign Spor 1-planens Assumption #1 (fjern stale `**Verified:** MCP` på de 14 filene) + bekreft TOC-scope-default (alle 324 store filer).
10. **Plan-patch:** legg manifest-re-entrans-vakt inn i Spor 1-planen (klassifiserer-CLI `--write` skal nekte/merge når manifestet er beriket med `resolvedBy`/`source`) + re-valider planen.
**Verifisering:** `grep -rn 'references/architecture' CLAUDE.md` viser kun skills-prefiks · `grep -rn '398' CLAUDE.md docs/` → 0 relevante treff · sanering bekreftet med søk → 0 treff i tracked filer · plan-validator strict exit 0 · suite exit 0 · commit + push, `git status --short` ren.
## R1R4 — Spor 1 substrat-migrering (4 økter, strengt sekvensiell)
Kjøres via `/trekexecute --project .claude/projects/2026-06-30-spor1-corpus-migration` (lokalt planprosjekt, 11 steg / plan v1.7+). Roadmapen dupliserer ikke stegene — kun sesjonsgrenser og sluttkriterier:
- **R1 = Session 1 (Steg 14):** header-audit → typeklassifiserer-core (TDD) → CLI + manifest persistert (`--write`, 389 entries, union == uavhengig målt live-tall) → edge-review via subagenter, manifest finalisert. **Verifisering:** manifest med 389 entries, `reviewFlag:false` overalt; suite exit 0.
- **R2 = Session 2 (Steg 56):** `insertHeaderFields` + kirurgisk `normalizeStaleVerified` (TDD; first-match/`---`-aware/pipe-safe) → authority-URL per reference-fil (deterministiske tie-breaks → subagent → defer-not-guess). **Verifisering:** suite exit 0; manifest `source`-beriket; defer-listen eksplisitt (aldri gjettet URL).
- **R3 = Session 3 (Steg 78):** `migrate-corpus.mjs` unified applier (TDD: backup + atomisk skriv + advisor-fence + per-felt-idempotens + post-write-assert) → akseptansetester skrevet FØR kjøring. **Verifisering:** suite exit 0 inkl. nye akseptansetester.
- **R4 = Session 4 (Steg 911):** kjør migreringen (~327 Type / ~253 Source / 324 TOC / 14 stale-verified fjernet) → re-score (CT5 `available:true`, N4 ~1) + worklist-aktivering + `docs/spor1-migration-outcome.md` (transient Spor D sub-90 merkes som policy-artefakt) → hygiene + full suite. **Deretter batch-release v1.17.0** (`release-plugin.mjs`, `check-versions.mjs` 0 ERROR).
**Eskaleringsregel (fra plananalysen):** per-fil post-write-assert-feil i Steg 9 → restore + stopp + rapporter; «logg som defer og fortsett» er ikke tillatt uten plan-revisjon.
## R5 — Spor 0: de 38+4 kjente innholds-fiksene (1 økt, split per skill ved behov)
Påfør `spor0-fix-manifest.json` (38 fikser / 25 filer) + G5b-fillisten (`adr-template.md`, `multi-region-azure-openai-deployment.md`, `network-resilience-patterns-ai.md`, `vector-storage-cost-optimization.md`). Mønster: subagent-fan-out henter/bekrefter kilde per fiks (v3.1-fanout-runbook som mal); hovedkontekst redigerer; tvilstilfeller → operatør. **Forutsetning:** R4 ferdig (substratet i ro). **Verifisering:** manifest 38/38 applied m/kilde-URL per fiks; suite exit 0.
## R6 — Korpus-judge-pass: brief + plan (1 planleggingsøkt, Voyage)
Selvbærende brief + adversarielt reviewet plan for v3.1-judgen over alle verifiserbare påstander i non-advisor-korpuset (~2146 fetches, ikke resume-safe → sesjons-batchet design med per-batch-manifest). Briefen skal inkludere: (a) **G2-restgapet** — generaliser stempel-guarden i `transform.mjs` FØR evt. judge-minor-bump; (b) beslutning **retire vs. harden TOC-backfill-scriptet** (unified applier `transform.insertToc` har overtatt; retire — utført R6 Step 6); (c) flaggformat som mater R11 direkte; (d) **G6 ingestion-gate (§8):** design to-lags sikkerhetsgate for all henting av eksternt innhold — llm-security-pluginen aktivert + verifisert fyrende (`post-mcp-verify`) i alle fetch-økter (headless-caveat GH #36071 → foreground eller kompenserende skann) + deterministisk node-skann (unicode/decode/injection) over endrede `skills/**/*.md` før commit. **Verifisering:** brief- + plan-validator strict exit 0; antall R7R10-økter fastsatt; G6-gate-design eksplisitt i briefen.
## R7R10 — Korpus-judge-pass eksekvering (243 due; 5 økter × ~49 filer, 810 samtidige/bølge)
**Populasjon:** 243 due-filer (`scripts/kb-update/report-full-pass-worklist.mjs`, alle never-verified); **5 økter × ~49** (`ceil(243/49)=5`). **Samtidighet kappet til 810 subagenter per bølge** (målt fan-out-skala, `docs/v3.1-fanout-runbook.md:43`), én subagent/fil, live MS Learn, blind for gull, read-only. **Pilot-gate:** første R7-batch begrenses til **≤45 filer** (pilot innenfor det beviste fan-out-løpet) → valider FØR de resterende 4 øktene skaleres til ~49.
**Durabilitet + resume:** `appendJudgedFile` skriver ÉN record atomisk til `scripts/kb-eval/data/judge-pass-manifest.json` etter HVER fil (maks tap ved krasj = 1 fil); resume = `pendingFiles(manifest, worklist)` hopper over allerede-judgede (R6 Step 4). Flagg-record mater R11 direkte (R6 Step 5, `docs/r11-flag-format-2026-07.md`).
**Aggregering (born-verified, ufravikelig):** `per_file_verdict='pass'` KUN hvis **HVER** judgebar claim er `grounded` (AND) → surgical `insertVerifiedFields`-stempel (body byte-identisk, R6 Step 2). Én `not_grounded``per_file_verdict='flagged'` + flagg-record, ALDRI stempel. **Passing-men-ustempelbar** (Verified-felt lander forbi 500-byte-vinduet → `insertVerifiedFields` kaster): behandles som `flagged` med disposisjon «header-slanking kreves», ALDRI tvunget stempel.
**G6-gate (ufravikelig):** R7 starter ALDRI uten G6 Layer A-aktiveringsprotokollen (R6 Step 8) verifisert — foreground fetch obligatorisk, ev. R6-definert kompenserende deterministisk skann (Layer B + pre-write unicode-scan, R6 Step 3). **Verifisering per økt:** G6-gate bekreftet ved øktstart; 0 udømte i batchen; `git status` viser kun manifest-/stempel-endringer; suite exit 0.
**R7-gate SKJERPET (kryssmodell-review 2026-07-09):** i tillegg til G6-LA kreves **RX-OPS1** grønn (Layer B håndheves i dag kun prosedyralt via command-instrukser — deterministisk pre-commit-håndheving + §5b inn i fan-out-runbooken MÅ på plass før fetch-økter) og **RX-KB1** grønn (87 filer bærer plain `Verified: MCP`-pipe-hale i 500B-vinduet; `insertVerifiedFields`-stempling uten opprydding gir to motstridende Verified-verdier per fil). Reviewens tillegg til R7-designet: pilot-batchen (≤45) velges så den dekker rename-drift-flatene (Azure AI Services→Foundry Tools, RBAC-rolle-rename, `azure-ai-inference`-retirement, Assistants-sunset — verifisert mot MS Learn 2026-07-09); G6-recheck ved HVER øktstart; fetchet innhold behandles som utrustet data i payload-skallet (judge-teksten selv forblir frosset).
## R11 — Flag→fiks-loop (1 økt, split ved stort flaggvolum)
Operatør-bekreftede fikser mot kilde + `verified`-bump per fikset fil (§3c-disiplin). **Verifisering:** alle flagg lukket (fikset eller avvist m/begrunnelse); suite exit 0.
## R12 — §7 fersk-gull-måling: programmets sluttbevis (1 økt)
Trekk NYTT blindt gull-utvalg (G5-protokoll: re-adjuder mot live før fasiten stoles på), mål flagget feilrate. **<~2 % → prosessgarantien er dokumentert virksom** — visjonens suksesskriterium. Utvalget blir neste kalibreringssett; periodisk gull-re-adjudering forankres her. **Verifisering:** rapport med målt feilrate + konfidensintervall committed; ≥2 % → ny R11-runde planlegges, ikke bortforklares.
## R13 — S-Cosmo del 1: mekanisk korpus-rens (1 økt)
Scripted transform (TDD) for Cosmo-forekomster i ref-korpuset (378 ref-filer; heading-nøytralisering) + absorberte rester: redirects (1a-C) og store-fil-TOC (1b) — inkl. TOC-regenerering ETTER nøytralisering (lukker `insertToc`-stale-TOC-§8-residualen). **Premiss-verifisering FØRST (review 2026-07-09):** tellingene divergerer — cosmo-briefen (2026-06-24) målte 188 filer m/ «For Cosmo»-seksjon / 417 filer totalt; reviewen målte 382 av 389 ref-filer / 1310 forekomster i skills/. Re-mål ved øktstart og avklar scope før transformen skrives. **Verifisering:** `grep -rl "Cosmo" skills/*/references | wc -l` → 0; TOC-ankre matcher faktiske headinger; suite exit 0; stikkprøve-diff-review.
## R14 — S-Cosmo del 2: persona, advisor og legacy (1 økt)
Fjerning i SKILL.md-er, 23 commands, 11 docs, rot-filer + `generate-skills.md`/`transform-prompt.md`; **advisor frontmatter-backfill + advisor judge-pass** (advisor judged etter Cosmo); retir legacy bash `MODEL=sonnet`. Release-bump. **Verifisering:** `grep -rli "cosmo" --include='*.md' .` (unntak per cosmo-removal-brief) → 0; advisor stemplet; suite exit 0; release grønn.
## R15 → R16+ — Skill-eval v2 (1 planleggingsøkt + est. 23 eksekveringsøkter)
`/trekplan --brief docs/skill-validation-routine-brief-2026-07.md` (committet i R0). Trinn 2 (live triggering m/precision+recall, 3× repetisjon, train/held-out), Trinn 3 (uplift vs. baseline), Trinn 4 (behavioral gate + `generate-skills`-wiring). Briefens §7-beslutninger (adopt vs. reimplement, kostnadsgating) avgjøres av operatør ved planreview. Re-score ETTER Spor 1 + S-Cosmo (kanonisert rekkefølge, programdok §6). **Verifisering:** briefens 7 testbare suksesskriterier.
## R17 — Dekningsaudit (1 økt — fleksibel, uavhengig)
Svar på det aldri-målte spørsmålet: **dekker de 389 filene de riktige temaene?** Fan-out: Microsoft AI-landskapet (Foundry / Copilot / Power Platform / Agent Framework / AI Act-flater) vs. faktisk KB-dekning → dekningsrapport + prioritert gap-liste som mates inn som fremtidige KB-emner (født-verifisert generering). **Verifisering:** rapport committed med tema-matrise + gap-liste.
## R18 — Onboarding uplift-måling (1 økt — fleksibel, uavhengig)
Maskineriet er bygget (krav 1+2+3 + per-kategori-hint); målingen er aldri kjørt. Design: samme oppgavesett med/uten onboardet kontekst, mål merkbar letthet (tid/kvalitet). **Verifisering:** uplift-rapport committed; beslutning videre loggført.
## R19 — Layer B ↔ `llm-ingestion-pipeline-security` konvergens (utsatt, driver-utløst)
**Utsatt / betinget — IKKE del av R0R18-programmet.** ms-ai-architects Layer B (adversarial-content-skann) kjører i dag på `../llm-security`-*pluginens* JS-scannere (grønt, urørt — bekreftet 2026-07-05). Målet (`docs/ingestion-security-brief-2026-07.md` §6) er å konvergere på den delte deterministiske scanneren i `llm-ingestion-pipeline-security` (det utpekte delte aktivumet; repo/remote `open/llm-ingestion-pipeline-security`, internt pakkenavn `llm-ingestion-guard`). **Utløser (reell driver, ikke spekulasjon):** når operatør vil migrere Layer B *bort* fra llm-security-pluginen. **Koordinerte beslutninger (m/ library-sesjonen 2026-07-05, relayet):** (1) biblioteket forblir ÉTT repo → polyglot (modell A) når Node bygges, aldri splitt; (2) Node-porten er bibliotekets **v0.2-milepæl**, med ms-ai-architect-konvergensen som driver; (3) **datasett-først** — det delte lexicon/charset-datasettet er den billigste, høyest-verdi, lavest-drift konvergensen (§6); implementasjons-deling (CLI-shell-out vs. tynne native matchere) er en separat senere beslutning; (4) disposisjon uendret (§5: høy-severity i lav-trust chunk → quarantine). **ms-ai-architect-datapunkt (verifisert herfra):** konvergens-flaten er **Node** (hele scan-stien er `.mjs`; to perifere Python-verktøy — `export-pdf.py`, `kb-eval/ref-file-audit.py` — er utenfor Layer B). **Åpen brikke som låser modell A:** `claude-code-llm-wiki`s språk (Python → polyglot tvingende; Node → Node-primært bibliotek levedyktig) — uverifisert herfra (repo ikke i `~/repos`), library-sesjonen settler. **Koordinasjonsmekanisme (hub-and-spoke):** kanonisk konvergens-kontrakt bor i hub-en (`llm-ingestion-pipeline-security`); denne R19 er ms-ai-architects spoke-peker. Utgående brief levert til hub 2026-07-05. **Verifisering (når utløst):** Layer B importerer den delte scanneren + delte lexicon-datasettet; `node --test tests/kb-update/*.test.mjs tests/kb-eval/*.test.mjs` exit 0; korpus byte-urørt; nøyaktig ÉN lexicon-kilde (ingen andre-kopi).
## R20 — Base-felt pre-pass del 1: **Category:**-backfill (1 økt — ungated, ⊥ R7) ✅ 2026-07-06
**Kontekst:** 25 ref-filer manglet enhver kategori-label. 24/25 er **not-due** (ikke i R7s 243) → kjøres i R7-vente-vinduet, disjunkt fra judge-passet, ingen header-budsjett-kollisjon. Utledningen viste at kun 5/25 var mekanisk avledbare (enstemmig mappe-taksonomi); de 20 øvrige (advisor toolkit + plattform-referanser) krevde en operatør-godkjent sjanger-/taksonomibeslutning (2026-07-06): ta dem inn i header-kontrakten med to nye kategorier.
**Utført:** ny testet primitiv `transform.insertMetaField(content, label, value)` — samme anker + 500B-back-off som `insertHeaderFields`, idempotent på eksakt label, body byte-identisk (6 tester) — driver `scripts/kb-update/backfill-category.mjs` (deterministisk folder→category-regel, hard per-fil-invariant «nøyaktig én linje satt inn», insert-only, aborterer FØR skriving ved avvik). Fordeling: **14** «Solution Architecture & Advisory» (architecture/), **6** «Microsoft AI Platforms» (platforms/ + development/), **4** «Responsible AI & Governance», **1** «MLOps & GenAIOps». Label = engelsk `**Category:**` (322 filer vs 42 `Kategori`). Eksisterende `recommended-mcp-servers` («Architecture») + `rag-maturity-model` («RAG Architecture & Decision Framework») urørt — begge forsvarlige, ingen feilpasting fantes (korrigert antakelse).
**Verifisering:** `grep -rLE '\*\*(Category|Kategori):\*\*' skills/*/references` → 0; git diff +25/0 (én linje/fil, body byte-identisk); idempotent re-run = 0 planned; suite 764/764 exit 0.
## R21 — Base-felt pre-pass del 2: **Status:** på not-due-filer (1 økt — ungated, ⊥ R7) ✅ 2026-07-06
**Mål:** lukk den rent-verifiserbare delen av base-felt-restansen på **not-due**-filene. Due-filenes Status/Last-updated FOLDES inn i R7 (Status er en faktapåstand judge-passet verifiserer mot live kilde; `**Verified:**`-stempelet er freshness-signalet) — backfilles ALDRI her.
**Premiss-korreksjon (ground-truth 2026-07-06, via `auditHeaders` på alle 389 splittet due/not-due):** STATE/roadmap-tallene var stale/feil. Faktisk: **43 mangler bold `**Status:**`** (22 due→R7, **21 not-due**) og **52 mangler engelsk `Last updated:`** (26 due→R7, **26 not-due** — ikke 48/22). To premisser i den opprinnelige planen var brutt: (1) «~22 not-due Last-updated» → faktisk 26; (2) «0 har norsk dato å relabele fra» → **falskt**: 21 av 26 not-due Last-updated-gap bærer allerede en norsk datolabel (`**Sist oppdatert:**`/`**Dato:** <dato>`), og de 5 «datoløse» gir «i dag» ved naiv git-siste-commit pga. R20-churn (bryter «ALDRI i dag»). Decision (a) er **moot**: 0 plattform-filer i not-due (alle sourced → due→R7). Norsk-label-residual (decision b) = **69 filer**, ikke 42.
**Utført (operatør-godkjent redusert scope 2026-07-06):** kun **Status**-backfill, kun de **14** rent engelsk-dialekt advisor/architecture-filene. Ny testet ren regel `statusForFile()` (filnavn-token `template|matrix|benchmarks|register``Reference`, ellers `Established Practice`; operatør-godkjent vokabular) + manifest-drevet driver `scripts/kb-update/backfill-status.mjs` (frosset 14-fil-manifest re-avledet fra regelen, hard per-fil-invariant «nøyaktig én linje», idempotent skip-if-present, `isMain`-guard så test-import ikke kjører driveren, aborterer FØR skriving). Fordeling: **7** `Reference` + **7** `Established Practice`. Diff-inspeksjon FØR commit fanget at **4** governance/responsible-ai `ai-act-*`-filer bar en **plain-text `Status: GA`** i en dual-header-blokk (usynlig for bold-only-regexen) → bold-innsetting duplikerte/motsa den → **revertert**, flyttet til residual. 7 tester.
**Verifisering:** `test-backfill-status` 7/7; git diff +14/0 (én `**Status:**`-linje/fil, 0 andre linjer, body byte-identisk); idempotent re-run = 0 written; not-due Status-missing 21→**3**; suite **771/771** exit 0.
**Korrigert residual → decision-(b) dialekt/dual-header-normaliseringspass (eget go, ⊥ R21):**
- **26 not-due Last-updated** — 21 relabel (`Sist oppdatert`/`Dato``Last updated`, behold dato), 5 datoløse (git-avledet dato krever «innholds-commit»-heuristikk som ekskluderer R19/R20-metadata-pass).
- **3 norsk-dialekt Status** — engelsk `**Status:**` ville blande dialekt; håndteres i samme dialekt-pass.
- **4 dual-header `ai-act-*`-filer** — plain-blokk (`Last updated:`/`Status: GA`/`Category:` linje 68) vs bold-blokk. **NB:** samme plain-blokk er hvorfor **R20 la til duplikat `**Category:**`** her (bold `Category` linje 3 vs plain `Category` linje 8) — begge duplikatene lukkes i normaliseringspasset. Mønsteret er innkapslet til nøyaktig disse 4 filene korpus-vidt.
- **69 norsk-label-filer** (`Kategori`/`Sist oppdatert`) — engelsk label-normalisering. _(Korrigert i R22: faktisk 42 `**Kategori:**` + 31 `**Sist oppdatert:**`, union 51 filer; «69» stemte ikke mot noen faktisk mengde.)_
## R22 — decision-(b) Enhet 1: ren dialekt-relabel (1 økt — ungated, ⊥ R7) ✅ 2026-07-06
**Mål:** lukk den trygge, verdi-bevarende kjernen av decision-(b)-residualen — ren label-oversettelse norsk→engelsk, ingen fabrikkering.
**Premiss-korreksjon (ground-truth 2026-07-06, `gt-audit`/`gt-labels` over alle 389, header-blokk = linjer før første `---`/`## `):** decision-(b)-tallene i R21-residualen var stale/ufullstendige på fire punkter:
1. **Tredje dato-dialekt oppdaget:** norsk dato bæres av `**Sist oppdatert:**` (31) **OG `**Dato:**` (16)** — R21 så bare `Sist oppdatert`. `**Dato:**` opptrer dessuten i **body-mal-blokker** (`**Dato:** [YYYY-MM-DD]`) → blind erstatning ville korruptert template-filer ⇒ Dato UTSATT til Enhet 2 (header-scoped ISO-dato-guard).
2. **«4 dual-header med duplikat `**Category:**`» → 0 bold-duplikater** korpus-vidt. De 4 `ai-act-*` bærer en *plain-text* `Category:`/`Status:`/`Last updated:`-blokk (ikke bold) — R21-reverten forhindret bold-duplikatet som fryktet. Håndteres i Enhet 3 (dedup).
3. **«5 datoløse» → 1** (kun `decision-trees.md` mangler dato helt i header) → Enhet 4.
4. **«Category-missing 0» / «8 mangler» er begge vindus-artefakter:** de 8 flagges av 500-byte-vinduet (≥1, `agentic-rag-patterns`, HAR Category forbi byte 500). Ekte gap verifiseres i Enhet 4.
**Utført (Enhet 1):** `**Sist oppdatert:**``**Last updated:**` (31) + `**Kategori:**``**Category:**` (42) = **73 relabels****51** filer (22 bærer begge). Ny testet ren primitiv `relabelHeaderDialect()` (header-blokk-scoped, kollisjons-guard mot eksisterende engelsk target, multi-forekomst-guard) + manifest-drevet driver `scripts/kb-update/relabel-dialect.mjs` (frosset 51-fil-manifest, hard per-fil-invariant «nøyaktig `applied.length` linjer endret, hver kun label-token, resten byte-identisk», idempotent skip, `isMain`-guard, aborterer FØR skriving). `**Dato:**` bevisst UTE av `LABEL_MAP`.
**Verifisering:** `test-relabel-dialect` 11/11; git diff **+73/73** på 51 filer (0 linjer endret utover label-token, verifisert via `grep` på begge dialekt-retninger); revers-substitusjon rekonstruerer original byte-eksakt; idempotent re-run = 0 relabels; ground truth `Kategori 42→0`, `Sist oppdatert 31→0`, `Missing English Last updated 52→21`; suite **782/782** exit 0.
### Enhet 2 — `**Dato:**``**Last updated:**` ✅ 2026-07-06
**Premiss-korreksjon (ground-truth `gt-dato-audit` over alle 28 `**Dato:**`-filer, samme header-blokk-def):** roadmap-tallet «`**Dato:**` (16)» var ufullstendig. Faktisk **29 forekomster i 28 filer**, klassifisert:
- **21 header-kandidater** (header-blokk, ikke list-item, ekte 20xx-dato).
- **16 «rene»** (`**Dato:**` er ENESTE datofelt) → relabelet i Enhet 2. Dette er de 16 «genuint manglende engelsk».
- **5 «dual-label»** bærer BÅDE `**Dato:**` (opprettelsesdato) OG `**Last updated:**` (endringsdato) med *distinkte* verdier (f.eks. `Dato 2026-02-04` + `Last updated 2026-06-24`). Blind relabel ⇒ duplikat label / tapt proveniens ⇒ **utskilt til dedup-enhet** (kollisjons-guarden aborterer på dem uansett).
- **8 body/list/placeholder** (3 advisor `YYYY-MM-DD`-maler, 2 `ros-report-templates` `[YYYY-MM-DD]`, 3 body list-items inkl. `[Dato]`) — aldri i scope (header-scoping + `isRealDateValue`).
**Design-forfining:** en naiv ISO-streng guard (`\d{4}-\d{2}-\d{2}`) ville feilaktig ekskludert ekte verdier `2026-04`, `2026-05`, `5. februar 2026`. Guarden er derfor `isRealDateValue()`: avviser placeholder (`[…]`, `YYYY`/`MM`/`DD`), aksepterer enhver verdi med et 20xx-år. Faktisk sikkerhet = frosset 16-manifest + header-scoping + kollisjons-guard + byte-invariant; `isRealDateValue` er dokumentert forsvar-i-dybde mot template-fellen.
**Utført:** `**Dato:**``**Last updated:**` = **16 relabels****16** filer. Gjenbrukte Enhet-1-primitiv `relabelHeaderDialect()` med `DATO_LABEL_MAP`; ny driver `scripts/kb-update/relabel-dato.mjs` (frosset 16-manifest, `isRealDateValue`-guard, samme harde per-fil-byte-invariant, idempotent skip, `isMain`-guard). De 5 dual-filene bevisst UTE av manifestet.
**Verifisering:** `test-relabel-dato` 10/10 (inkl. disk-integritet: committed-state + at de 5 dual-filene forblir urørt); git diff **+16/16** på 16 filer (hver endret linje = label-swap, verifisert begge retninger); revers-substitusjon byte-eksakt; idempotent re-run = 0; verdier bevart (`2026-04`, `5. februar 2026`, …); ground truth `Missing English Last updated (non-advisor) 20→4`, gjenstående `**Dato:**` = 13 (5 dual + 8 body); R22-Enhet-1-tool fortsatt no-op (51/51 already-english); suite **792/792** exit 0.
### Enhet 3 — Status-backfill + ai-act dual-header-dedup ✅ 2026-07-07
To operasjoner, én økt (⊥ R7), begge metadata-normalisering (verdi ALDRI fabrikkert).
**Premiss-korreksjon (ground truth 2026-07-07, `audit-corpus-headers.mjs` + worklist):** roadmap sa «27 none + 4 ai-act». Målt: **29** filer mangler bold `**Status:**` = **25 rene «none»** (ingen Status-markør) + **4 ai-act** (plain `Status: GA`). De «27» inkluderte 2 for mye: **2 filer** (`monitoring-observability/custom-dashboards-ai-operations`, `ai-security-engineering/zero-trust-ai-services`) bærer bold `**Status:**` KUN forbi byte 500 → present for full-fil-audit, men **usynlig for 500-byte header-parseren**. De er IKKE manglende felt — de er en egen **header-slanking-residual** (§8-register), utenfor Enhet 3.
**Op A — Status-backfill 25 rene none-filer.** Utvidet den ene Status-mekanismen `backfill-status.mjs` (MANIFEST 14→**39**; samme `statusForFile` + `insertMetaField` + hard per-fil-invariant, idempotent skip på de 14 R21-gjorte). Alle 25 → `**Status:** Established Practice` (ingen matcher `template|matrix|benchmarks|register`-token). Diff **+25/0**, hver = én `**Status:**`-linje i bold-meta-run innenfor 500B.
**Op B — ai-act dual-header-dedup (4 filer).** Ny driver `dedup-plain-header.mjs` + 2 nye rene primitiver i `transform.mjs`: `boldifyPlainField()` (plain `<label>: <verdi>``**<label>:** <verdi>`, verdi bevart byte-eksakt, header-scoped, idempotent) og `dropRedundantPlainField()` (sletter plain-linje KUN når bold `**<label>:**` med **identisk verdi** beviser redundans; **kaster** ved verdi-avvik eller manglende bold — aldri auto-slett). Per fil: plain `Last updated:` + `Status: GA` → bold (verdi bevart: `2026-06-18`/`2026-02`, `GA`), redundant plain `Category:` fjernet (bold Category fra R20 bevart). Hard per-fil-invariant: net 1 linje, begge felt bold m/ bevart verdi, ingen plain-header-felt igjen, body byte-identisk. Diff **12/+8** på 4 filer (net 1/fil).
**Verifisering:** `test-backfill-status` 8/8 + `test-dedup-plain-header` 13/13; audit **Missing Status 29→0**, **Missing English Last updated 4→0**; git diff skills = 29 filer +33/12 (25 Status-insert + 4 dedup), alle tilførte linjer verifisert (kun `**Status:**` + de 8 bold-swappene), diff-kontekst inspisert per fil ([[dual-header-dialect-blindness]]); begge drivere idempotent (re-run 0 writes); suite **806/806** exit 0. `none=8`-dialekt uendret (Enhet 4-scope).
**Gjenstående decision-(b)-enheter (egne økter, ⊥ R7):**
- **Enhet 3b (dedup):** 5 dual-label-filer med `**Dato:**` (opprettelse) + `**Last updated:**` (endring). Beslutning kreves: behold `**Dato:**` som eget «opprettet»-felt (relabel til `**Created:**`?) vs. fjern som redundant. **Målt 2026-07-07:** 4 av 5 har distinkt opprettet≠endret (`**Dato:**` bærer ekte info); 1 (`mlops-security-access-control`) har identiske datoer (`**Dato:**` redundant). Fabrikk/slett ALDRI uten operatør-beslutning. Filer: `feedback-loops-continuous-improvement`, `genaiops-llm-specific-practices`, `mlops-security-access-control`, `model-deployment-strategies-azure`, `prompt-flow-production-deployment` (alle mlops-genaiops).
- **Enhet 4 (KRYMPET av review 2026-07-09):** 1 datoløs (`decision-trees.md`, git-«innholds-commit»-heuristikk, ALDRI «i dag»). De 8 «category-none» er AVGJORT: alle 8 HAR `**Category:**` ved byte 504735 (vindus-artefakt, målt 2026-07-09) → felt-flytting i RX-HDR, IKKE backfill (en «none»-keyet backfill ville gjenskapt dual-label-buggen).
- **Residual RX-HDR (header-slanking, §8-register; UTVIDET av review):** 2 filer med bold `**Status:**` forbi byte 500 (`custom-dashboards-ai-operations` byte 19796, `zero-trust-ai-services` byte 26489) + de 8 Category-forbi-vindu-filene (7× azure-ai-services + `agentic-rag-patterns`) = **10 filer**. Ikke missing-felt; krever header-omstokking (ny ren primitiv `compactHeader()`, body byte-identisk), ikke insert. Lukkes egen økt.
## §RX — Injiserte sesjoner fra kryssmodell-review 2026-07-09 (går FØRST i køen)
_Uavhengig kryssmodell-review (read-only, primærkilde-verifisert) fant 7 BLOCKER + 15 MAJOR. Full rapport m/ fil:linje-bevis + detaljerte sesjon-specs (TDD-planer, nøkkelantakelser, verifiseringskommandoer): LOCAL-ONLY `.claude/projects/2026-07-09-crossmodel-review/{review-2026-07.md, replan-proposed.md}`. Sammendrag per sesjon under; specene der er styrende._
### RX-REG — Regulatorisk resynk + én frist-kilde (1 økt, ungated, FØRST)
Omnibus-status er utdatert i tre lag (CLAUDE.md-NB, `session-start-context.mjs:97-105`, `ai-act-assessor.md:140-146`): formelt vedtatt EP 16. juni + Rådet 29. juni 2026 (OJ ventet juli); «Kommisjonen kan fremskynde»-påstanden motsies av endelig tekst (fast dato, trigger droppet — to uavhengige kilder); Art. 50-raden står som «Gjeldende» før 2026-08-02; stop-hooken (`stop-assessment-reminder.mjs:65-68`) feilmerker 2026-08-02 som «GPAI-frist» i aktiv bruker-output; assessor-malen mangler 2026-12-02-raden; Nkom (utpekt koordinerende tilsynsmyndighet) navngis ikke i assessor/CLAUDE.md. **Rotårsak-fiks inngår:** ÉN maskinlesbar frist-kilde + synk-test på tvers av de tre konsumentene (gap-disiplin: mekanisme, ikke bare fiks). **Verifisering:** synk-test grønn; `grep -rn 'kan fremskynde\|under etablering' CLAUDE.md agents/ hooks/` → 0; suite exit 0.
### RX-REG-KB — Governance-ref innholds-fikser (12 økter, Spor 0-protokoll)
Kjernefilene classify laster bærer verifiserte innholdsfeil: `ai-act-compliance-guide.md` (pre-Omnibus-frister ×6, INVERTERT høyrisiko-profileringslogikk i beslutningstreet L213-218, feil bøtesatser L459-462) og `ai-act-classification-methodology.md:38-45` (Art. 5(1)-bokstavkart feil på 3 rader; skraping-forbudet — ekte 5(1)(e) — mangler helt). Pluss artikkelreferanse-feil på tvers (5(d)→5(c) forsikring, Art. 71→49, 72→73, 12→19/26(6)), intern frist-motstrid (`conformity-assessment.md:177` vs `:346`; `ms-tools-mapping.md:227-262` vs `:215`), Nkom-harmonisering (10+ filer), retensjonstall. **Protokoll (ufravikelig):** hver påstand verifiseres mot EUR-Lex/offisiell norsk kilde → menneske bekrefter → kirurgisk fiks + `Last updated`-bump. Regresjonstest: grep-basert frist-lint over governance-refs. **Verifisering:** kilde-URL per fiks i commit; lint grønn; suite exit 0.
### RX-REG² — OJ-lukking (kort økt; utløses av OJ-publisering, ventet juli 2026)
Flipp «vedtatt, avventer OJ» → «i kraft» m/ OJ-referanse; lukk nudifiserings-forbudet (nytt Art. 5-forbud i Omnibus — artikkelplassering + anvendelsesdato mot OJ-tekst) og Art. 111-legacy-radene. Sjekk OJ-status ved hver øktstart til publisert.
### RX-P1 — Plugin-sti-hardening for installert modus (1 økt)
0 `${CLAUDE_PLUGIN_ROOT}` utenfor hooks: alle Task-prompter/agent-KB-kontrakter bruker relative stier som kun resolver med cwd = plugin-rot (dev-modus) — installert fra katalogen mister subagentene rollefiler + KB-last. **START med installert-modus-repro (failing smoke) + bekreft `${CLAUDE_PLUGIN_ROOT}`-substitusjon i commands/agents FØR masseendring.** Forén de tre delegeringskonvensjonene til registrert agentnavn (`Task(architect:dpia-agent)` og `Task(general-purpose)+Read agents/` avvikles). Deterministisk lint i `validate-plugin.sh`. Fold inn: plugin.json `repository`-URL, `generate-skills.md:45` «(sonnet)»-tekst, `architect.md:15`-sti.
### RX-P2 — Regulatorisk kjede-wiring + agent-sti-baser (1 økt; etter RX-P1)
classify→dpia→ros er i dag prosa, ikke wiring: dpia-/ros-Task-templatene får eksplisitt klassifiserings-/DPIA-felt (kjede-data), dpia-agentens uutførbare «spør bruker»-instruks erstattes med «merk vurderingen ved manglende grunnlag», kortform-KB-stier som krysser skill-grenser fullkvalifiseres (3 agenter), ADR-skriveansvar entydiggjøres. Lint: alle agent-KB-stier resolver fra plugin-rot.
### RX-KB1 — Header-kontrakt restanse 2 (1 økt; FØR R7; etter RX-OPS2)
87 filer m/ plain `| Verified: MCP <dato>` i 500B-vinduet (usynlig for bold-only-stacken; claimer verifisering judgen aldri gjorde — samme poison-klasse som de 14 bold Spor 1 fjernet) → operatør-beslutning strip (anbefalt) vs. relabel, frosset manifest, verdi-bevarende. Audit-fiks: base-felt-sjekkene vindus-scopes (i dag testes HELE filen — klassen «i fil men utenfor vindu» er strukturelt usynlig) + pipe-hale-deteksjon + label-whitelist (`Opprettet`/`Område`/`Målgruppe`/`Konfidensgrad`-rest). Footer-avvik: 6 filer m/ header/footer-datomotstrid flagges → menneske; placeholder-footere ryddes.
### RX-OPS1 — G6-mekanisering (1 økt; R7-gate sammen med G6-LA)
Layer B er i dag kun prosedyre-wiret (command-markdown; ingen produksjonskode kaller skannen, `.git/hooks/` tom) → deterministisk pre-commit-sjekk (bash 3.2-kompatibel) som kjører `scan-adversarial-content.mjs` over stagede `skills/**/*.md`. `v3.1-fanout-runbook.md` får §5b-sjekklisten som Forutsetning 0 + untrusted-data-ramme i payload-SKALLET (judge-teksten forblir frosset — ingen judge-bump).
### RX-OPS2 — Skrive-sikkerhet i driverne (1 økt; FØR neste korpus-skriv)
De 5 skrivende driverne (backfill-status/category, dedup-plain-header, relabel-dialect/dato) over på `atomicWriteSync`; `restore()` scopes til kjøringens egne skriv (i dag rulles HELE skills/ tilbake — sletter parallelle økters arbeid — og har destruktivt rm→cp-vindu); `backfill-category` får frosset manifest + testfil (i dag u-manifestert og utestet); `detectStaleRollback`/`cleanupOldBackups` wires inn.
_Fixtures-/playground-frister m/ foreldet tidslinje (testdata) tas som hale i RX-REG-KB. F8 (release-vindu i `release-plugin.mjs`: `--create-tag` pusher tag før write-sjekk) hører til KATALOG-repoet — egen liten økt der eller ved neste release. Tause feilklasser i deteksjonssporet (svelgede step-feil, foreldreløs log-rotate) foldes inn i fremtidig Tier-2-aktiveringsøkt (moot til noe kjører unattended)._
## Parkert (krever eget operatør-go)
- **OKF second brain** (spec v0.1 ratifisert; bygging = separat go). **NYTT operatør-krav 2026-07-09: sesjons-utbyttbar OKF-bundle.** Review-vurderingen (akse 5): kravet forutsetter Stage-1-konformering (dagens `org/` er ikke en bundle; 12 agenter hardkoder stien; «sesjon» mangler config-primitiv) → foreslått **S-OKF-1** (bundle-substrat + `resolveActiveBundle()`-presedens env > prosjekt-`.local.md` > bruker > default), **S-OKF-2** (`/architect:bundle list/use/status/validate` + orkestrator-gir-sti-mønsteret i alle agenter), **S-OKF-3** (retrieval-skill over aktiv bundle, native Grep/Glob/Read). Gated på operatør-bekreftelse av 3 antakelser (un-parkerer swap-kravet Stage 1? gjelder second brain, ikke skill-refs? prosjekt-nøkkel + kommando-bytte = akseptabel sesjons-semantikk?). Detaljert spec i review-prosjektet.
- **Pris/unsourced-verifisering** (74 % av prispåstander ikke maskinverifiserbare; operatør-gated).
- **Historikk-håndtering** for saneringen i R0 hvis operatør ønsker mer enn fremoverrettet fiks (egen beslutning).
- **Ambisiøse utvidelser A1A5** (reviewens forslag, utenfor godkjent scope — egne go per stykk): OKF-swap som førsteklasses kapabilitet (=S-OKF), KB-query-skill over de 389 refene (metadata-filtrert list→grep→les), per-fil ferskhets-/verifiseringssignal i agent-output, regulatorisk-ferskhet-vakt (Claude-fri polling av EUR-Lex/nkom.no/regjeringen.no à la sitemap-mønsteret — reviewen beviste behovet: Omnibus-vedtaket lå ubemerket 10+ dager), uttrekk av portabel korrekthets-kjerne til søster-plugins (etter R12).