docs(ms-ai-architect): R14-forberedelse — mål persona utenfor ref-korpuset og foreslå unntakssettet gaten mangler

R14-gaten er ikke uoppnåelig som ordren antok. Den er ubestemt: roadmapen skriver
`grep -rli "cosmo" --include='*.md' . (unntak per cosmo-removal-brief) → 0` — klausulen
FINNES og delegerer til briefen, og briefens §4 sier «0 (eller dokumentert restmengde)».
Restmengden er aldri blitt dokumentert. Dette dokumentet dokumenterer den.

FIRE KLAUSULER MÅLT HVER FOR SEG (R13-lærdommen: én rettet feil fredner ikke resten)

(S) SKOPET er feil i begge retninger. `command grep -rli "cosmo" --include='*.md' .` gir
1348 filer i arbeidstreet, hvorav 1146 er `.kb-backup/` og 9 er `.claude/`+STATE.md — mengder
som aldri leveres. Avgrenset til `git ls-files '*.md'`: 192. Samtidig SER gaten ikke 29
tracked ikke-.md-filer (~429 forekomster), blant dem R13s eget maskineri (cosmo-persona.mjs
90, test-cosmo-persona 88, check-cosmo-gate 25) og `.gitignore` (3).
MÅLEINSTRUMENTET TELLER OGSÅ: i en Claude Code-økt er `grep` en shell-funksjon som wrapper
`ugrep --ignore-files` og respekterer .gitignore — 192 der ekte grep gir 1348. Første
måling i denne økten var derfor feil og er forkastet.

(a) REFERENTEN: 9 `Cosmos`-formede forekomster utenfor korpuset, alle håndsjekket. 1 av 9
feilklassifisert — `ref-kb-gold-reconciliation:93` «Cosmos multi-region writes» er Azure
Cosmos DB (avgjort av URL-en i samme tabellrad), men R13s genitivregel gjør den til persona.
Årsak: PRODUCT_FOLLOWERS er enumerert over NORSKE funksjonsord i ref-korpuset, som ikke
inneholder engelsk produktprosa. Klassifikatoren må re-valideres på R14-populasjonen, ikke
bare på korpuset den ble født i. Alle tall her er korrigert for denne.

(b) REKKEVIDDEN: R13s 40-oppførings heading-tabell når 1 av 145 forekomster utenfor korpuset;
2 headinger er ikke i tabellen og transformen KASTER på dem (fail-safe). 142 av 145 er prosa,
tabell, kodeblokk og fete innledninger — redaksjonelt, ikke tabelloppslag.
TYNGSTE FUNN: FEM steder PRODUSERER ny persona — transform-prompt.md (lest av
commands/kb-update.md:129), skill-gen/prompt-template.md (lest av generate-skills.sh:27 →
claude --print), commands/generate-skills.md, commands/kb-update.md:192 («Behold "For
Cosmo"-seksjonen»), docs/kb-update-apply-brief.md:19. R13s gate er grønn, men ikke STABIL:
neste KB-generering re-minter headingen R13 fjernet 401 av.

(c) DET SOM SKAL STÅ: 83 forekomster i 10 filer (historikk + derivasjonsrecord), enumerert
per fil i §4.

FORESLÅTT GATE: G4 leveranseflate → 0 (62 i 32 filer i dag) · G5 produkt pinnet PER FIL
(459 i dag) · G6 derivasjonsregisteret pinnet per fil. G6 pinnes på FOREKOMST-TALL, aldri på
filnavn: målt går briefen 32 → 33 når ny persona injiseres, og et talls-pin feller den mens
et fil-nivå-unntak er blindt. Dokumentet er lukket under sin egen dokumentasjon: det bidrar
selv med 33 persona + 8 produkt, så registeret emitteres til 116 i 11 filer.

NETT VALIDERT BEGGE VEIER på R14-populasjonen: 3 kjent-positive (injisert prosa, norsk
genitiv, heading — alle 0→1 i en fil med 0), 3 kjent-negative (Cosmos DB, «cosmos for
audit», infrastructure/SKILL.md), 1 dokumentert kjent-negativ som FEILER (§2a), og
unntaksformen selv målt. Blindhetstest: 64 tracked filer bærer «Skyberg», null uten «cosmo»
— målt hver halvdel for seg fordi det delte 32/32 skal mistenkes.

ARVEDE PÅSTANDER MÅLT USANNE: «3a73eea er UPUSHET» (git ls-remote: pushet) · «briefen har
ingen unntaksliste ⇒ gaten er skrevet uten unntak» (gaten HAR klausulen) · «13 docs-filer»
(11) · roadmapens R14-scope mangler skill-gen/prompt-template.md og playground/A11Y-RAPPORT.md.

ÅPENT OG IKKE LUKKET HER: briefens §1 — skal advisor-dialogen ha nøytral ramme, ny navngitt
persona, eller ingen? R13 ratifiserte en HEADING-form, ikke §1. SKILL.md er ~250 linjer
andreperson-persona og 23 kommandoer åpner «Du er … i en X-rolle»; mekanisk substitusjon gir
ubrukelig norsk. Separat beslutning fra unntakssettet.

Ingen transform skrevet, ingen ref-fil rørt, ingen tagg, ingen versjonsbump.

VERIFISERT: suite 1120/1120 · validate-plugin.sh 250/0/0 · check-cosmo-gate GATE PASSED +
NETTET VALIDERT BEGGE VEIER · neutralize --dry 0 å endre (389 urørt) · RX-OPS1 adversarial
scan kjørt MANUELT (core.hooksPath skygger repoets .git/hooks/pre-commit) → OK.

Ordre: 20260912T202845Z-474518317-from-ms-ai-architect

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-13 07:25:57 +02:00
commit 06713ed7b8

View file

@ -0,0 +1,218 @@
# R14-forberedelse — persona utenfor ref-korpuset: måling og foreslått gate
**Målt:** 2026-09-13 · **Status:** FORSLAG — krever operatør-ratifisering før R14-transformen skrives
**Forgjenger:** R13 del 1 (`3a73eea`) · **Kilde-brief:** `docs/cosmo-removal-brief-2026-06.md`
**Klassifikator:** `scripts/kb-update/lib/cosmo-persona.mjs` (R13, gjenbrukt — ikke ny)
Dette dokumentet gjør to ting: det måler persona-populasjonen **utenfor** ref-korpuset, og det
foreslår unntakssettet R14-gaten mangler. Det skriver ingen transform.
---
## 1. Roadmapens R14-gate er ikke uoppnåelig — den er *ubestemt*
Roadmapen (`.claude/…/plugin-roadmap-2026-07.md § R14`) skriver gaten slik:
> `grep -rli "cosmo" --include='*.md' .` **(unntak per cosmo-removal-brief)** → 0
Unntaksklausulen finnes altså. Den delegerer til briefen. Briefens eneste tilsvarende setning er
§4: «`grep -rc Cosmo` → 0 **(eller dokumentert restmengde)**». Briefen inneholder ingen liste
(målt: 0 treff på «unntak», «exception», «except»; kjent-positiv: 16 treff på persona-navnet, så
nettet kan finne). Gaten reduserer seg dermed til «0, **eller** en dokumentert restmengde» — og
restmengden er aldri blitt dokumentert. Det er den åpne beslutningen dette dokumentet lukker.
**Konsekvens:** gaten har aldri vært usann i formen. Den har vært *utfylt halvveis*.
## 2. Fire klausuler målt hver for seg
R13 lærte at én rettet feil ikke fredner resten. Gaten er derfor dekomponert, og hver klausul målt.
### (S) Skopet — `.` og `--include='*.md'` treffer feil mengde, i begge retninger
| Måling | Tall |
|---|---|
| `command grep -rli "cosmo" --include='*.md' .` (arbeidstreet) | **1348 filer** |
| — herav `.kb-backup/` (lokale KB-backuper, gitignorert) | 1146 |
| — herav `.claude/` (LOCAL-ONLY planer) + `STATE.md` | 9 |
| Samme spørring avgrenset til `git ls-files '*.md'` | **192 filer** |
| Tracked **ikke**-`.md`-filer som bærer strengen | **29 filer / ~429 forekomster** |
To uavhengige feil: gaten **teller med** 1155 filer som aldri skal leveres (backup + local-only), og
den **ser ikke** 29 tracked filer fordi de ikke er `.md` — blant dem R13s eget maskineri
(`lib/cosmo-persona.mjs` 90, `test-cosmo-persona.test.mjs` 88, `check-cosmo-gate.mjs` 25) og
`.gitignore` (3). Fire filnavn utenfor `.md` bærer strengen selv.
> **Måleinstrumentet teller også.** I en Claude Code-økt er `grep` en shell-funksjon som wrapper
> `ugrep --ignore-files` og respekterer `.gitignore`. Den gir 192 der ekte `grep` gir 1348. Enhver
> R14-måling må kjøres med `command grep` eller via node — aldri med øktens `grep`.
**Forslag:** skopet er `git ls-files '*.md'` (tracked), målt programmatisk.
### (a) Referenten — strengen betyr fortsatt to ting, og diskriminatoren er målt på feil populasjon
Utenfor ref-korpuset finnes **9** `Cosmos`-formede forekomster. Alle er håndsjekket:
| Fil:linje | Tekst | Dom | Klassifikator |
|---|---|---|---|
| `commands/review.md:61` | «Legg til Cosmos helhetsvurdering» | persona (norsk genitiv) | ✅ persona |
| `commands/security.md:48` | «Legg til Cosmos vurdering» | persona (norsk genitiv) | ✅ persona |
| `skills/ms-ai-infrastructure/SKILL.md` ×4 | «Cosmos DB …» | produkt | ✅ produkt |
| `skills/ms-ai-security/SKILL.md:106` | «… Blob Storage, Cosmos DB» | produkt | ✅ produkt |
| `playground/test-fixtures/cost.md:22` | «blob + cosmos for audit» | produkt | ✅ produkt |
| `docs/ref-kb-gold-reconciliation-2026-06.md:93` | «Cosmos multi-region writes … /azure/cosmos-db/…» | **produkt** | ❌ **persona** |
**1 av 9 er feilklassifisert.** R13s genitivregel er `Cosmos <liten forbokstav>` = persona, med en
enumerert liste norske funksjonsord som unntak. Lista ble enumerert over ref-korpuset, som ikke
inneholder engelsk produktprosa. «Cosmos multi-region writes» treffer regelen og blir persona.
Dommen er avgjort av URL-en i samme tabellrad. Alle tall i dette dokumentet er korrigert for den.
**Forslag:** utvid `PRODUCT_FOLLOWERS` med de engelske produktordene, ELLER — enklere og
presist — la en håndadjudisert forekomst-override bære de få tilfellene. Uansett: **klassifikatoren
må re-valideres på R14-populasjonen før tallene konsumeres**, ikke bare på korpuset den ble født i.
### (b) Rekkevidden — R13s operasjon når 3 av 145, og generatorene reverserer den
R13s transform er en **heading-tabell** med 40 ratifiserte oppføringer. Utenfor ref-korpuset finnes
bare 2 persona-headinger og 1 TOC-lenke. Av dem er 1 i tabellen; 2 er det ikke, og transformen
**kaster** på dem (fail-safe, ikke stille feil):
- `skills/ms-ai-advisor/SKILL.md:11``# Cosmo Skyberg - Microsoft AI Solution Architect`
- `docs/cosmo-removal-brief-2026-06.md:1``# Cosmo-persona — full utfasing (brief)`
R13-maskineriet er altså **ikke** en drop-in for R14. 142 av 145 forekomster er prosa, tabellceller,
kodeblokker og fete innledninger — redaksjonelt arbeid, ikke tabelloppslag.
> **Det tyngste funnet: fem steder *produserer* ny persona.** R13s gate er grønn i dag, men ikke
> stabil — neste KB-generering re-minter nettopp headingen R13 fjernet 401 av.
>
> | Sted | Hva det gjør | Konsument (verifisert) |
> |---|---|---|
> | `scripts/kb-update/transform-prompt.md:63,82` | ber modellen skrive seksjon «8. For arkitekten (Cosmo)» | `commands/kb-update.md:129` leser den |
> | `scripts/skill-gen/prompt-template.md:18,77` | samme seksjon i skill-generatoren | `generate-skills.sh:27``claude --print` |
> | `commands/generate-skills.md:11,61,120,284` | prompt med `## For arkitekten (Cosmo)` innbakt | selve kommandoen |
> | `commands/kb-update.md:192` | «Behold "For Cosmo"-seksjonen …» | selve kommandoen |
> | `docs/kb-update-apply-brief.md:19` | subagent-kontrakt: «behold «For Cosmo»…-seksjon» | apply-flyten |
>
> Korreksjon til egen mellomregning: `lib/transform.mjs` *nevner* prompt-fila i en kommentar, den
> leser den ikke. Konsumenten er kommandoen.
### (c) Det som skal bli stående — 83 forekomster i 10 filer (116 i 11 med denne fila)
Se registeret i §4. To klasser: **historikk** (CHANGELOG-rader som omtaler utfasingen sant;
CLAUDE.md forbyr historikk-omskriving) og **derivasjonsrecord** (docs-planer og -briefer som
dokumenterer hvorfor beslutningene ble tatt). Begge er sanne utsagn om fortiden.
---
## 3. Foreslått R14-gate — tre klausuler oppå R13s G1/G2/G3
Skop for alle: `git ls-files '*.md'`, målt programmatisk med R13-klassifikatoren.
| | Klausul | Mål | I dag |
|---|---|---|---|
| **G4** | persona i **leveranseflaten** | **0** | 62 i 32 filer |
| **G5** | **produkt** urørt — pinnet **per fil**, ikke som global sum | per-fil som baseline | 459 (451 korpus + 8 utenfor) |
| **G6** | **derivasjonsregisteret** pinnet per fil | eksakt som §4 | 83 i 10 filer |
**G6 pinnes på forekomst-tall per fil, ALDRI på filnavn.** Målt: injiserer man en ny persona-linje i
`docs/cosmo-removal-brief-2026-06.md` går tellingen 32 → 33, og et talls-pinnet unntak feller den.
Et fil-nivå-unntak («hopp over denne fila») ser den ikke — fila er unntatt uansett innhold. Det er
forskjellen mellom et unntak og et hull.
### Nett-validering (kjørt 2026-09-13, begge veier)
| Retning | Test | Utfall |
|---|---|---|
| kjent-positiv | `agents/adr-writer-agent.md` har 0 → injisert «Du er Cosmo Skyberg.» | ✅ 0 → 1 |
| kjent-positiv | injisert norsk genitiv «Cosmos vurdering» | ✅ 0 → 1 |
| kjent-positiv | injisert persona-**heading** | ✅ 0 → 1 |
| kjent-negativ | «Cosmos DB», «cosmos for audit» | ✅ 0 persona |
| kjent-negativ | `skills/ms-ai-infrastructure/SKILL.md` (4 produkt) | ✅ 0 persona |
| **kjent-negativ som FEILER** | «Cosmos multi-region writes …» | ❌ klassifiseres persona — dokumentert i §2(a) |
| unntaksform | ny persona injisert i unntatt fil | ✅ tall-pin feller · ❌ filnavn-unntak er blindt |
**Blindhetstest av vokabularet:** 64 tracked filer bærer «Skyberg». **Null** av dem bærer «Skyberg»
uten også å bære «cosmo» — verken på fil- eller linjenivå. Strengen `cosmo` er ikke blind for
personaens etternavn. (32 utenfor korpuset + 32 i korpuset = 64; målt hver for seg fordi et identisk
delt tall skal mistenkes.)
---
## 4. Det foreslåtte unntakssettet (G6-registeret)
Disse 83 forekomstene skal **bli stående**. Hver linje er et pin, ikke et filnavn-hopp.
| Fil | Forekomster | Klasse |
|---|---|---|
| `CHANGELOG.md` | 6 | historikk — omskriving forbudt (CLAUDE.md) |
| `docs/cosmo-removal-brief-2026-06.md` | 32 | kildedokument; bærer strengen i eget **filnavn** |
| `docs/ref-kb-workflow-plan-2026-06.md` | 25 | planrecord (S-Cosmo-sporet) |
| `docs/ref-kb-direction-note-2026-06.md` | 6 | retningsnotat, sekvenseringsrisiko |
| `docs/ref-kb-correctness-program-2026-06.md` | 4 | programrecord |
| `docs/kb-refresh-backlog-2026-06.md` | 3 | backlog-peker til briefen |
| `docs/spor1-authority-selection.md` | 3 | scope-record (advisor-fence) |
| `docs/skill-validation-routine-brief-2026-07.md` | 2 | scope-record |
| `docs/devils-advocate-audit-2026-06-18.md` | 1 | auditrecord |
| `docs/kb-mechanism-redesign-brief.md` | 1 | designrecord |
| `docs/r14-persona-gate-measurement-2026-09.md` (denne fila) | 33 | målerecord — se note under |
| **SUM** | **116** | i 11 filer |
**Dette dokumentet blir selv en oppføring — målt, ikke anslått.** Det bærer persona-strengen fordi
det måler den: **33 persona + 8 produkt** (klassifikatoren kjørt på fila selv). R14-baselinen må
derfor emitteres til **116 persona i 11 filer** i registeret, og produkt-pinnene må inkludere dette
dokumentets 8. Et unntakssett som ikke er lukket under sin egen dokumentasjon, ugyldiggjør seg selv
ved første commit — og en global produkt-sum ville blitt usann av nettopp denne fila, som er grunnen
til at G5 pinnes per fil.
**Én oppføring er flyttet på skjønn.** `docs/kb-update-apply-brief.md:19` ligger under `docs/`, men
er ikke et record: det er en levende subagent-kontrakt som sier «behold «For Cosmo»-seksjon». Den er
sortert på det diskriminerende trekket (operativ vs. historisk), ikke på stiprefikset, og hører
derfor i **leveranseflaten** — ikke i registeret. Krever operatørens ja.
### Leveranseflaten (G4 → 0): 62 forekomster i 32 filer
`README.md` 14 · `commands/` 32 i 23 filer · `skills/ms-ai-advisor/SKILL.md` 6 ·
`skills/ms-ai-engineering/SKILL.md` 1 · `scripts/kb-update/transform-prompt.md` 2 ·
`scripts/skill-gen/prompt-template.md` 2 · `CLAUDE.md` 2 · `NOTICE.md` 1 ·
`playground/A11Y-RAPPORT.md` 1 · `docs/kb-update-apply-brief.md` 1.
**Roadmapens R14-scope er ufullstendig.** Den nevner «SKILL.md-er, 23 commands, 11 docs, rot-filer +
`generate-skills.md`/`transform-prompt.md`». Målt mangler: `scripts/skill-gen/prompt-template.md`
(2 — og den er live, lest av `generate-skills.sh`) og `playground/A11Y-RAPPORT.md` (1).
Ordrens «13 docs» er også feil; roadmapens 11 stemmer (9 record + briefen + apply-briefen).
`playground/A11Y-RAPPORT.md:15` er grensetilfellet: «| Tester | Cosmo Skyberg via Claude Code |» er
en proveniens-linje som attribuerer en faktisk testkjøring til en oppdiktet person. Foreslått som
leveranseflate — å nøytralisere den gjør rapporten sannere, ikke bare renere.
---
## 5. Den andre åpne beslutningen R14 ikke kan starte uten
Briefens §1 stiller spørsmålet som aldri er besvart:
> «Skal advisor-dialogen ha en ny nøytral ramme («arkitekturrådgiver»), en ny navngitt persona,
> eller ingen persona? Dette styrer SKILL.md + kommando-omskrivingen og er den eneste reelle
> designbeslutningen.»
R13 ratifiserte en **heading-form** (`For Cosmo``For arkitekten`) i ref-korpuset. Det er ikke
svaret på §1. `skills/ms-ai-advisor/SKILL.md` er en ~250-linjers persona-definisjon i andreperson
(«Du ER …», «Du er … en erfaren løsningsarkitekt»), og 23 kommandoer åpner med «Du er … i en
X-rolle». En mekanisk substitusjon gir ubrukelig norsk. §1 må besvares før R14-transformen skrives —
den er en separat beslutning fra unntakssettet, ikke en del av det.
---
## 6. Tall som ble arvet og målt usanne
| Arvet påstand | Kilde | Målt |
|---|---|---|
| «`3a73eea` er UPUSHET» | ordre + STATE.md | **pushet** (`git ls-remote origin refs/heads/main`) |
| «briefen har ingen unntaksliste ⇒ gaten er skrevet uten unntak» | ordre | gaten **har** klausul `(unntak per cosmo-removal-brief)`; briefen har «eller dokumentert restmengde» |
| «13 docs-filer» | ordre | **11** (roadmapens tall stemmer) |
| «4 SKILL.md» | ordre | 4 av **5** bærer strengen — riktig, men repoet har 5 |
| «417 filer nevner Cosmo / 956 forekomster» | briefen 2026-06-24 | historisk, pre-R13 — ikke gjenbrukbart |
**Ikke målt i denne økten:** de 29 ikke-`.md`-filene er talt, men ikke persona/produkt-klassifisert
per forekomst. De ligger utenfor gatens `--include='*.md'` og utenfor R14s ratifiserte flate; skal
de inn, er det en egen scope-utvidelse med egen måling.