docs(ms-ai-architect): Spor B plan godkjent — skill-livssyklus (krav 5+6, omdefinert)

Aktiverer de utsatte krav 5 (lage nye skills) + krav 6 (merge/saner/retire),
omdefinert per operatør-retning 2026-06-20:
- deteksjon først (ikke-destruktiv, driver ops)
- best-practice-bar = K1–K9 + K10 søsken-scope-ikke-overlapp
- INGEN nye domener (ikke Power Platform/Dynamics); tyngdepunkt merge/saner
  på de 5 eksisterende; create = dvelende kapabilitet
- Azure-deployment = grensesone eng↔infra (B1 første deteksjonsmål), bekreftet

Superseder kb-mechanism-redesign-plan.md:19 (krav 5/6 «UTE av scope») for Spor B.
3 faser B1 (deteksjon) → B2 (K10) → B3 (ledger+ops). Arkitektur-invariant arvet:
alle skill-ops via decisions.json + operatør-gate; aldri tap av kuratert verdi.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
This commit is contained in:
Kjell Tore Guttormsen 2026-06-20 11:09:11 +02:00
commit e8ceb7a8b4

View file

@ -0,0 +1,102 @@
# Spec — Spor B: Skill-livssyklus (ms-ai-architect)
_Plan-input (operatør-retning 2026-06-20, IKKE ferdig-godkjent ennå). Avløser «Spor B»-stikkordene i `kb-mechanism-redesign-plan.md` linje 281/383. Implementeres én sesjon per økt, per-fase gated; STATE.md peker på neste sesjon. Sti-konvensjon: relativt til plugin-rot._
## Hva dette er
Spor A (krav 14) er komplett: mekanismen holder de **eksisterende** 5 skillene oppdatert, komplette og målbart optimaliserte (K1K9 grønn, lag 06 står). Spor B aktiverer de to kravene som ble **utsatt** (ikke forkastet) 2026-06-19:
- **Krav 5 — lage nye skills profesjonelt.** (`kb-mechanism-redesign-plan.md:90`)
- **Krav 6 — slå sammen / slette / sanere skills (livssyklus, destruktive ops).** (`kb-mechanism-redesign-plan.md:91`)
Forutsetningene er nå innfridd: krav 5 «forutsetter lag 03» og krav 6 «vurderes etter at lag 16 står» — alt står.
> **Scope-endring (eksplisitt):** `kb-mechanism-redesign-plan.md:19` listet krav 5/6 som «UTE av scope». Denne planen flytter dem **inn** i scope, men **omdefinert** (se under). Linje 19 er dermed superseded av dette dokumentet for Spor B.
## Operatør-retning 2026-06-20 (binder denne planen)
1. **Deteksjon først.** Bygg skill-granulær deteksjon (ikke-destruktiv, kun forslag); create/merge/saner drives av det deteksjonen finner.
2. **Best-practice-bar = K1K9 + overlapp-kriterium.** Behold K1K9 (nå grønn); legg til ett nytt førsteklasses kriterium: søsken-scope-ikke-overlapp.
3. **INGEN nye domener.** Ikke Power Platform, ikke Dynamics 365. De 5 skillene dekker domenerommet. → Tyngdepunktet forskyves fra *create* til **merge/saner på de eksisterende 5**. Create bygges som **dvelende kapabilitet** (mekanismen finnes og valideres, men ingen ny domene-skill shippes nå).
### Åpen antakelse — MÅ bekreftes før B1 bygges
Operatør sa: «det eneste [nye dekningsområde] måtte være **overlapp mot Microsoft Azure for deployment**». Tolkning lagt til grunn: dette er IKKE en ny skill, men en **grensesone** mellom eksisterende `ms-ai-engineering` («bygge») og `ms-ai-infrastructure` («drifte») rundt Azure-deployment/-drift. → Brukes som **det konkrete første deteksjonsmålet** i B1 (overlap-detektoren ser spesifikt på engineering↔infrastructure-grensen). Hvis tolkningen er feil: korriger før B1.
## Arkitektur-invarianter (arvet fra Spor A — ufravikelig)
- **Ingen direkte KB-/skill-skriving.** Deteksjon/verifisering/transformasjon skriver ALDRI til `skills/` direkte — kun via `decisions.json` etter operatør-gate. Lag 3/4/5 returnerer kun data/verdict.
- **Aldri tap av kuratert verdi.** Destruktive ops (merge/saner/retire) har obligatoriske guardrails som beviser at kuratert innhold er bevart (ref-fil-invariant + diff vist før apply).
- **TDD.** Test før kode. Deterministiske kriterier regrederer aldri (`eval --json` + de fire suitene = akseptansemål: validate 239 · kb-update 122 · kb-eval 15 · kb-integrity 192/192).
- **Kontinuitet:** kun STATE.md/MEMORY.md/CLAUDE.md + `docs/`-referanser.
---
## Fase B1 — Skill-granulær deteksjon (oppdage) · ikke-destruktiv
**Problem:** Dagens deteksjon (lag 1) jobber kun på referansefil-nivå; `SKILL.md` er eksplisitt ekskludert (`build-registry.mjs:27`). Ingenting resonnerer om skill-overlapp, dekningshull eller oppblåsthet.
**Mål:** Tre detektorer som resonnerer på SKILL-nivå og produserer KUN en rapport (`scripts/kb-eval/data/skill-lifecycle-report.json`), aldri skriving til `skills/`.
1. **Overlap-detektor** — gjenbruk K1-mekanikken (`data/k1-trigger-prompts.json`, blindet judge) men cross-skill: hvilke prompts trigger >1 skill? Output: overlapp-par + styrke. **Første konkrete mål: engineering↔infrastructure (Azure-deployment-grensen).**
2. **Coverage/gap-detektor (innen-domene)** — per taksonomi-kategori: er den eid + dekket (ref-fil-antall vs forventet)? Flagg tynne/ueide kategorier. Ingen nye domener — kun hull *innenfor* det dekkede.
3. **Bloat/stale-detektor (per skill)** — K3-margin (body-linjer mot 500) + aggregert ref-stale-andel per skill → split-/saner-kandidat.
**Leveranser:** `scripts/kb-eval/detect-skill-lifecycle.mjs` (+ libs etter behov) · `data/skill-lifecycle-report.json` · tester `tests/kb-eval/test-skill-lifecycle-detect.test.mjs`.
**Gate-kriterier (verifiserbare):**
- `node scripts/kb-eval/detect-skill-lifecycle.mjs` kjører, skriver gyldig `skill-lifecycle-report.json` med de tre detektor-seksjonene; **0 skriving til `skills/`** (bekreft med `git status` etter kjøring).
- Overlap-detektoren rapporterer engineering↔infrastructure-paret med en tallfestet overlapp-score.
- Nye tester grønne; de fire eksisterende suitene uendret (239/122/15/192).
---
## Fase B2 — Best-practice-bar: K10 søsken-scope-ikke-overlapp (definere)
**Mål:** Utvid rubrikken med ett nytt kriterium **K10 = søsken-scope-ikke-overlapp** (deterministisk der mulig: cross-skill trigger-kollisjon fra B1-mekanikken; semantisk i `judge-prompt.md` der nødvendig). Dette er baren merge/create-beslutninger hviler på.
**Leveranser:** K10 i `eval.mjs` og/eller `judge-prompt.md` · måling på alle 5 · gated regenerering av `eval-baseline.json` · oppdatert `kb-eval`-test (forventet ny telling) · STATE/roadmap-tall.
**Gate-kriterier:**
- K10 definert og målt på alle 5; resultat dokumentert. (Forventning: kan avdekke FAIL — det er signalet som mater B3 merge/saner, ikke en blokkering.)
- Baseline regenerert via gated `--write`; `kb-eval`-suiten grønn med ny telling.
- K1K9 ikke regredert.
---
## Fase B3 — Ledger-utvidelse + livssyklus-ops (opprette / slå sammen / sanere) · krav 5 + krav 6
**Mål:** Utvid `decisions.json` med skill-nivå action-typer og bygg ops som gated transformasjoner (lag-4-analog på skill-granularitet), hver med guardrails. Alt via operatør-gate.
**Ledger-utvidelse:** legg `action`/`operation_type` i `decisions-io.mjs`-skjemaet: `merge_skills`, `sanitize_skill`, `retire_skill`, `create_skill`. (Dagens skjema er URL-nøklet, har ikke `action`-felt — `decisions-io.mjs`.)
**Ops (prioritert per operatør-retning):**
- **merge_skills (aktiv).** Guardrail: pre/post ref-fil-antall bevart (ingen tap), begge descriptions forsont, `category_skill` i taksonomi oppdatert, kryss-refs fikset, absorbert skill retired. Dry-run produserer `decisions.json`-entry + full diff; ingenting anvendt uten eksplisitt godkjenning.
- **sanitize_skill (aktiv).** Kun dødt innhold (orphan-refs, dead paths fra `kb-integrity`-warnings) — diff vist; aldri kuratert innhold.
- **retire_skill (aktiv, sjelden).** Hel-skill kun via eksplisitt gate + arkivering (aldri hard delete uten arkiv).
- **create_skill (dvelende).** Scaffold som passerer K1K10 fra fødsel; valideres mot et test-domene, men **ingen ny domene-skill shippes** (svar 3). Beviser at mekanismen finnes.
**Gate-kriterier:**
- `decisions-io.mjs`-skjema utvidet + tester for hver action-type (round-trip, dedup).
- merge: guardrail-test beviser at ALLE ref-filer fra begge skills finnes etter merge (count-invariant + sett-likhet).
- Hver op har dry-run som skriver decisions-entry + diff og anvender INGENTING uten godkjenning (test bekrefter no-write uten approval).
- create: scaffold-output passerer `eval.mjs` K1K10 grønt for test-skillen.
- De fire suitene + K1K10 ikke regredert.
---
## Ute av scope (Spor B)
- Nye domener (Power Platform, Dynamics 365, etc.) — eksplisitt nei.
- Restpunkter fra Spor A-stikkordene som ikke er skill-livssyklus: scheduled deteksjon · kurs-spor #25 · low-currency-bøtta (51) · bredere Source-backfill · onboarding-redesign #26. (Beholdes på roadmap; tas separat.)
## Sesjons-sekvens (foreløpig)
| Sesjon | Innhold | Gate |
|--------|---------|------|
| 13 | B1 overlap-detektor (eng↔infra Azure-deployment først) | report m/overlapp-score, 0 skill-skriving |
| 14 | B1 coverage/gap + bloat/stale-detektorer | full `skill-lifecycle-report.json`, tester grønne |
| 15 | B2 K10 + gated baseline-regen | K10 målt alle 5, baseline grønn |
| 16+ | B3 ledger-utvidelse + ops (merge/saner først) | guardrail-tester, dry-run no-write |
_Tall er foreløpige; én feature per sesjon, gated. create_skill (dvelende) tas sist._