ms-ai-architect/docs/plugin-roadmap-2026-07.md

228 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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** på **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** på **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).