ms-ai-architect/docs/plugin-roadmap-2026-07.md
Kjell Tore Guttormsen 5a0e8d774a feat(ms-ai-architect): R21 — Status-backfill på 14 advisor-ref-filer (redusert scope etter premiss-korreksjon) [skip-docs]
Manifest-drevet applier (scripts/kb-update/backfill-status.mjs) over den testede
insertMetaField-primitiven + ny ren regel statusForFile (filnavn-token → Reference/
Established Practice, operatør-godkjent vokabular). 7 Reference + 7 Established Practice.
Hard per-fil-invariant (én linje, body byte-identisk), idempotent, isMain-guard. 7 tester.

Premiss-korreksjon (auditHeaders, ground-truth 2026-07-06): ekte not-due-restanse er
21 Status + 26 Last-updated (STATE sa 21/22). «0 har norsk dato» var falskt — 21/26
Last-updated-gap bærer allerede Sist oppdatert/Dato → relabel-residual; 5 datoløse gir
«i dag» ved naiv git → utsatt. 4 dual-header ai-act-*-filer med plain-text «Status: GA»
fanget i diff-inspeksjon → revertert (unngår duplikat/motsigelse) → residual (samme
plain-blokk ga R20 duplikat Category). Korrigert residual logget i roadmap §R21.

Verifisering: test-backfill-status 7/7; git diff +14/-0 (kun Status-linjer, body
byte-identisk); not-due Status-missing 21→3; full suite 771/771 exit 0.
2026-07-06 09:41:40 +02:00

142 lines
20 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 R0R21 (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.
## 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)
Parkert (eget operatør-go): OKF second brain · 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.
## 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). **Verifisering:** `grep -rl "Cosmo" skills/*/references | wc -l` → 0; 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.
## Parkert (krever eget operatør-go)
- **OKF second brain** (spec v0.1 ratifisert; bygging = separat go).
- **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).