d00ea93081
chore(ms-ai-architect): release v1.16.1 — KB-refresh (tema a+b+RBAC)
...
v1.16.1
Frigir akkumulert KB-arbeid som lå ufrigitt på main siden v1.16.0:
- Modellkatalog GPT-5.1 → GPT-5.5 (3 filer)
- Foundry-navnesveip «Azure AI Foundry» → «Microsoft Foundry» (233 filer, 810 forekomster)
- RBAC-rolle-renavn «Azure AI User» → «Foundry User» (1 fil)
Kun reference docs — ingen kommando-/agent-/skill-endringer. validate-plugin 239/0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 21:33:28 +02:00
e78fb2f698
docs(ms-ai-architect): KB-refresh RBAC-rolle-renavn — Azure AI User→Foundry User (1 fil)
...
Microsoft har omdøpt Foundry RBAC-rollene (visningsnavn) — rolle-IDer og
kjernepermisjoner UENDRET. Verifisert mot offisiell MS-doc (juni 2026,
konsistent «Important»-note på tvers av kilder):
- Azure AI User → Foundry User
- Azure AI Owner → Foundry Owner
- Azure AI Account Owner → Foundry Account Owner
- Azure AI Project Manager → Foundry Project Manager
Kun ÉN genuin bruks-forekomst i korpuset (RBAC-krav for publisert
Agent Application-endepunkt). Renavnet med parentes «(tidligere Azure AI
User — rolle-ID og kjernepermisjoner uendret)» ved nevningen, konsistent
med at gamle navn fortsatt vises under utrullingen.
BEVART: azure-ai-foundry-cost-governance.md:109 dokumenterer hele
renavn-mappingen som forklarende ref (tema b) — ikke rørt.
Ref-fil-edit (ikke SKILL.md) → judge-cache gyldig. Deterministisk re-score:
advisor 91, eng/gov/infra/sec 96 (alle ≥90, uendret). validate 239/0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 21:23:09 +02:00
03d596e4ec
docs(ms-ai-architect): KB-refresh tema-b — Foundry-navnesveip «Azure AI Foundry»→«Microsoft Foundry» (233 filer)
...
Verifisert mot offisiell MS-doc (juni 2026): «Microsoft Foundry» er det
gjeldende produkt-/portalnavnet; «Foundry (classic)» = gamle «Azure AI Foundry»
(/azure/foundry/ vs /azure/foundry-classic/). Premiss bekreftet før sveip.
Multi-regel, IKKE naiv s/Azure AI Foundry/Microsoft Foundry/ — MS dropper
«Azure AI» (legger IKKE til «Microsoft») for to produktvarianter:
- «Azure AI Foundry Agent[ Service|s]» → «Foundry Agent Service/Agents» (MS-form)
- «Azure AI Foundry Models» → «Foundry Models» (i «Azure OpenAI in Foundry Models»)
- «Azure AI Foundry SDK» → «Microsoft Foundry SDK» (operatør-valg)
- «Azure AI Foundry portal/project» + generisk → «Microsoft Foundry»
- Pre-eksisterende «Microsoft Foundry Models» (4) normalisert → «Foundry Models»
Bevart: «Azure OpenAI», «Azure AI Inference SDK», «Azure AI Search»,
«Azure AI Services», kode-IDer. Historisk ref «(tidligere Azure AI Foundry)»
i model-catalog-2026.md beskyttet via lookbehind. URL /azure/ai-foundry/→
/azure/foundry/ kun i owasp-llm-top10 (KB-ref); docs/-filer deferred.
Scope: skills (inkl. 3 SKILL.md) + commands + agents + README + CLAUDE.
Ekskludert: docs/ (interne), playground/+tests/ fixtures (testdata),
CHANGELOG.md (historisk logg), STATE.md (gitignored).
3 SKILL.md endret (advisor/engineering/security) → judge-cache teknisk
invalidert for disse, men scorer uendret: advisor 91, eng/gov/infra/sec 96
(alle ≥90). validate 239/0. 0 «Azure AI Foundry» igjen (utenom bevart ref).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 21:00:27 +02:00
20b522ab10
docs(ms-ai-architect): KB-refresh tema-a steg 2 — modellkatalog GPT-5.1→5.5 i azure-ai-foundry.md
...
Tema (a) sveip av 27 GPT-5-filer fullført (triage). Korpuset er overveiende
allerede current eller pedagogisk: 9 filer kjenner allerede 5.x-generasjonen
(gpt5-gpt41-pricing, reasoning-models, structured-output, token-per-second,
m365-copilot, copilot-studio, cost-models, deterministic-cost, multimodal),
~14 har kun pedagogiske/passing mentions ("GPT-4→GPT-5", generisk "GPT-5-serien").
Eneste genuine drift: azure-ai-foundry.md — GPT-5 GA-tabell + intro-enumerering
var én generasjon bak (kun aug-2025-settet), tross delvise 2026-06-18 residens-edits.
- GPT-5-tabell utvidet med gpt-5.1->5.5 (GA-datoer, kontekst, kontekstsprang ~1M
for 5.4/5.5, gpt-5.5 Data Zone EU i Norway East) — speilet eksakt mot katalogen.
- Intro-enum: "GPT-5-serien (...)" -> "GPT-5-generasjonen (... utvidet med 5.1->5.5)";
o3/o4-mini -> full o-serie.
- Header->2026-06 + Source + pointer til kanonisk model-catalog-2026.md.
Naming (Azure AI Foundry->Microsoft Foundry) urørt — egen pass (tema b).
validate 239/0, ms-ai-advisor 91/100 (judge-cache gyldig, kun deterministisk re-score).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 20:46:01 +02:00
ac276e9d4b
docs(ms-ai-architect): KB-refresh tema-a steg 1 — modellkatalog GPT-5.1→5.5 i 2 critical cost-filer
...
Reconcile stale lokale modell-enumereringer mot kanonisk model-catalog-2026.md
(2026-06-18, live-verifisert). Pilot: 4 critical cost-filer auditert (~400k tokens),
2 hadde reell content-drift (modellkatalog en generasjon bak), 2 kun naming/noise.
- model-selection-price-performance.md: GA-modell-snapshot utvidet fra GPT-5/4.1 til
hele GPT-5.1→5.5-generasjonen + o-serien + pointer til catalog. Tiering-anbefalinger
flagget for egen pass (judgment, ikke mekanisk).
- batch-processing-cost-reduction.md: batch-støttet modellsett febr→juni 2026
(gpt-5.1/gpt-5/o3/o4-mini/gpt-4.1-familien); API-versjon korrigert til v1 API.
50%-rabatt + 24h-turnaround urørt (re-verifisert current).
Begge: header→2026-06 + Source-header (folder inn Source-backfill).
Naming (Azure AI Foundry→Microsoft Foundry) urørt — egen pass (tema b).
validate 239/0, ms-ai-security 96/100. Ref-edits → judge-cache gyldig, kun re-score.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 20:34:45 +02:00
59b4de938f
feat(ms-ai-architect): Spor E E-polish — per-kategori typisk/sjelden-hint i onboarding Phase 1–5 (TDD) [skip-docs]
...
Speiler Phase 6-coachingen til de fem strukturerte fasene: hver Phase 1–5
får et `**Hint — typisk relevant / sjelden relevant:**`-prosahint som agenten
deler med brukeren før AskUserQuestion-spørsmålene, slik at intervjuet coacher
mot riktig alternativ i stedet for å fyres av blankt. Hintene er grunnet i
filens egne option-lister (ingen nye eksterne påstander → verifiseringsplikt
ivaretatt). Agent-fil, ikke skill → ingen judge-/score-effekt.
TDD: 4 nye assert i test-onboarding-parity.sh (RED→GREEN) — ASCII-only anker
«typisk relevant / sjelden relevant» ×5 + «Del med brukeren» + begge framing-ord.
Bash 3.2-fix: ankeret holdes ASCII-only fordi multibyte em-dash i en shell-var
under `set -u` + gåseøyne-interpolasjon kræsjer scriptet.
e2e onboarding-parity 25/25, validate 0/0, discovery 13/13, kb-integrity 192/0,
full e2e grønn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 20:00:07 +02:00
c413d335bc
feat(ms-ai-architect): Spor D steg 1 — apply regenererer hel-korpus score-cache post-mutasjon (TDD) [skip-docs]
...
apply-skill-op.mjs skrev aldri score-cachen (data/skill-score-report.json) selv
— kun score-skill.mjs --write gjorde det. Etter en create/merge/sanitize/retire-
apply var derfor STEG C SessionStart-surfacingen stale til operatøren manuelt
re-scoret.
Ny eksportert refreshScoreCache(report, {cachePath, generatedAt}): ren
scoreReport+buildScoreCache, én writeFileSync, injiserbar generatedAt (determini-
stisk i test). main() bygger nå buildReport() ÉN gang ved res.applied og deler
den mellom printQualityGate(report,…) (refaktorert til å ta report) og
refreshScoreCache(report). Hel-korpus med vilje: retire dropper, create legger
til, merge/sanitize flytter søsken-K10 → cachen er uavhengig av HVILKEN skill
endret seg.
TDD: 4 nye assert i tests/kb-eval/test-apply-score-cache.test.mjs (RED→GREEN).
kb-eval 154/154, kb-update 323/323, validate 239/0, kb-integrity 192/0. Real
cache er gitignored → testene skriver kun til tmpdir.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 19:51:04 +02:00
d6a60ca480
feat(ms-ai-architect): Spor E krav 2 — onboarding Phase 6 guided-prose (coaching) (TDD) [skip-docs]
...
Phase 6 (fri kontekst) coacher nå brukeren FØR det åpne spørsmålet med to
lister: «hva som typisk hører hjemme» (initiativer, smertepunkter, tidligere
hendelser, strategiske føringer, leverandør-preferanser/-forbud) og «hva du
vanligvis kan hoppe over» (det de fem strukturerte kategoriene alt fanget;
generell AI-synsing; secrets/sensitive personopplysninger → ALDRI). Lagring
forblir ordrett. Lukker operatør-krav 2 (S39): onboarding skal coache på
inkludering/ekskludering, ikke bare stille ett blankt spørsmål.
TDD: 7 nye assert i tests/test-onboarding-parity.sh (RED→GREEN), suite-navn
utvidet til «K4-paritet + Phase 6 guided-prose». 21/21 PASS. validate 0-fail,
test-hooks 11/11, user-data node 25/25 — alle grønne.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 18:48:40 +02:00
97ebcd737a
feat(ms-ai-architect): Spor D Steg C — skill-quality SessionStart-surfacing (TDD) [skip-docs]
...
summarizeSkillQuality(cache) (pure) in detection-schedule.mjs: one-liner
"Skill-kvalitet: N skills < 90 % (navn)"; null when all skills meet target,
when the cache is missing (gitignored → absent in a fresh clone), or when the
shape is malformed. Reads the CACHED skill-score-report.json (from Steg B) —
never scores live (buildReport reads ~400 ref-files). Wired into
session-start-context.mjs after the course-signals block (same
existsSync/try-catch pattern). 7 new tests (kb-update 316 → 323).
[skip-docs]: README is the public end-user doc; skill-quality scoring is
maintainer-only tooling (the cache is gitignored, so the signal never surfaces
for end-users). The right doc homes ARE updated: CLAUDE.md hook table + a
caveat note (this commit), and docs/skill-quality-scoring-plan.md §3 komponent 4.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 18:38:35 +02:00
92cd93771b
feat(ms-ai-architect): Spor D Steg B — skill-quality lifecycle-gate + score-cache (TDD)
...
B1: gateSkill(report, name) — pure post-mutation verdict (blocked/provisional/
improvements), wired into apply-skill-op.mjs to re-score the affected skill from
fresh disk after create/merge/sanitize-apply. K10 floor enforced immediately;
unjudged → provisional + nudge to re-run the judge pass. retire → skipped.
B2: buildScoreCache(result) — compact, deterministic cache shape + score-skill.mjs
--write [path] → data/skill-score-report.json (always whole-corpus). Gitignored
(derived/regenerable; avoids churn in the public repo). Consumed by Steg C surfacing.
8 new tests (tests/kb-eval/test-skill-score-gate.test.mjs). kb-eval 150 pass,
validate 239 pass. Live score unchanged: advisor 91, eng/gov/infra/sec 96, 0 < 90.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 18:26:29 +02:00
c578482933
chore(ms-ai-architect): untrack STATE.md → local-only (offentlig open/-remote)
...
STATE.md er intern state-of-play og skal ALDRI nå et offentlig speil. Dette repoets
Forgejo-remote (open/) publiseres open source, så STATE.md gjøres local-only per den
globale kontinuitets-regelen (samme som linkedin-studio). Hooken injiserer den fra
disk uavhengig av tracking → kontinuitet upåvirket. Historikk-scrub følger.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 18:11:02 +02:00
a6ff17fd45
feat(ms-ai-architect): Spor D steg A — eng+infra K10-fix → korpus-invariant ≥90 oppfylt
...
Skjerper ms-ai-infrastructure-description for å bryte build↔operate-overlappet
mot ms-ai-engineering (operatør-godkjent leaning, S38): "multi-region"→"cross-region"
og "edge AI architecture"→"edge AI deployment". Fjerner de delte distinktive tokenene
`multi` (vekt 0.5) og `architecture` (0.333) → eng↔infra combined 7.4167→6.5833 (< 7.0
terskel). Korpus-maks faller til 6.8333 (eng↔gov, pass). Begge edits sammen gir lavere
worst-case enn edit #1 alene (6.9167), derfor robust margin.
Resultat: K10-gulvet løftes for begge → eng 89→96, infra 89→96. ALLE 5 skills nå ≥90
(advisor 91, eng/gov/infra/sec 96). Korpus-invarianten (operatør-krav S38) oppfylt.
Judge-cache (🔑 -regel): description-edit invaliderer infra K1. Re-judget mot det
operatør-kuraterte 20-settet — UENDRET 1.0/0.0/1.0 (edit fjerner kun tokens → kan ikke
gi falske positive; in-domain #2/#6 trigger fortsatt på BCDR/hybrid-vokabular).
K4/K7/K8/K9 uendret (body/refs urørt). Provenance oppdatert S11→S39.
Test: K10-real-five-testen pinnet pre-fix-baseline (eng+infra FAIL) — oppdatert til å
pinne korpus-invarianten (alle 5 pass, eng↔infra < 7.0). kb-eval 142/142, kb-update
316/316, validate 239/0, kb-integrity 192/0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 17:56:43 +02:00
c1a09062d4
feat(ms-ai-architect): Spor D steg 2 — score-skill CLI (--json/--gate/--skill) (TDD)
...
Byggekloss for både SessionStart-surfacing og lifecycle-gate (D3).
- eval.mjs: ekstraher buildReport() (eksportert, testbar) ut av main() —
samler hele korpus-rapporten (deterministisk + K10 + merget judge-cache).
- lib/skill-score.mjs: formatScoreReport() (ren) — sortert forbedringsrapport
med score, status, floored/provisional/ujudget-tags og ⚑gulv-markering.
- score-skill.mjs (NY CLI): buildReport → scoreReport → render/json/gate.
--skill scorer hele korpuset (K10 trenger alle søsken) men rapporterer/gater
kun den valgte → inkrementell enkelt-skill-scoring for D3 lifecycle-gate.
- docs/development.md: ny «Skill-kvalitetsscore (Spor D)»-seksjon.
Live baseline: advisor 91, governance/security 96 (OK); engineering +
infrastructure 89 (floored av K10-gulv) UNDER mål. Gate exit=1.
Tester: kb-eval 134→142 (+8). validate 239, kb-update 316 uendret grønt.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 17:16:44 +02:00
e87289d929
feat(ms-ai-architect): Spor D N1–N5 — Anthropic-deterministiske skill-sjekker (TDD) [skip-docs]
...
Legger de fem deterministiske sjekkene fra Anthropics «Skill authoring best
practices» som K1–K10-rubrikken manglet, i begge lag av score-motoren:
- eval.mjs (disk-laget): extractName + checkN1..checkN5
- N1 name-validitet (≤64, a-z0-9-, ingen «claude»/«anthropic»; gerund rapporteres, gater ikke)
- N2 description ikke-tom + ≤1024 tegn
- N3 refs én nivå dypt (ref-fil lenker ikke til annen ref-fil)
- N4 TOC i ref-filer >100 linjer (delpoeng = andel store filer med TOC)
- N5 forward-slash-stier (ingen Windows-backslash-stier i body)
wiret inn i evalSkill.deterministic (leser nå ref-fil-innhold for N3/N4)
- lib/skill-score.mjs (ren): N1–N5 i CRITERIA (vekt 1, ikke-gulv, det)
Live-sanity mot de 5 skills: N1/N2/N5 rene, N3 fanger ekte nøstet ref i
advisor (licensing-matrix.md → 3 andre ref-filer), N4 avdekker 387 store
ref-filer uten TOC (primær forbedringsspak for oppgraderingsfasen).
Tester: kb-eval 110→134 (+24). validate 239, kb-update 316 uendret grønt.
[skip-docs]: N1–N5 alt spesifisert i docs/skill-quality-scoring-plan.md §2.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 17:09:29 +02:00
bab9f2d23d
feat(ms-ai-architect): Spor D — skill-quality score-motor (ren lib + rubrikk grunnet i Anthropic) (TDD)
...
Objektiv 0-100 kvalitetsscore per skill, operatør-besluttet modell: vektet
delpoeng + hardt gulv på de load-bearing kriteriene (K1 trigger-presisjon, K10
søsken-overlapp) — en skill som ikke trigger riktig eller overlapper en søster
kan aldri «bestå» 90 %, uansett form.
Rubrikken er VERIFISERT mot Anthropics faktiske skill-authoring-guidance
(platform.claude.com best-practices + skill-creator + plugin-dev + engineering-
bloggen) og er nesten 1:1 med deres kanoniske sjekkliste — ikke akademisk
oppfunnet. Kilder + vekter/gulv låst i docs/skill-quality-scoring-plan.md.
scripts/kb-eval/lib/skill-score.mjs (NY, ren): scoreSkill(evalObj) konsumerer
eval.mjs-objektet (K1-K10 + judge-cache) → {score, rawScore, floored, judged,
provisional, criteria[], improvements[], meetsTarget}. Degraderer pent når
ujudget (judge-kriterier ekskludert, K1-gulv kan ikke håndheves → provisional;
K10-gulvet deterministisk → gjelder alltid). scoreReport() summerer < 90.
Tester (+10): 100-score, gulv kapper ved K1/K10-fail (også ujudget), delkreditt
(K3 lengde / K4 score/5), degradering ekskluderer judge, forbedringsliste
sortert på poeng-tap m/ fix, null-toleranse. kb-eval 100→110, validate 239/0.
GJENSTÅR (neste): N1-N5 deterministiske Anthropic-sjekker i eval.mjs + CLI
score-skill.mjs --gate 90 + summarizeSkillQuality-surfacing; DERETTER eval+
oppgradering av alle 5 skills én-og-én. Roadmap i docs + STATE.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 16:57:31 +02:00
cb0450ee2d
feat(ms-ai-architect): C3 (3) — --courses-flagg i write-schedule-config.mjs (TDD) + live-probe-doc
...
Eier-CLI kan nå sette include_course_detection uten å hand-edite den gitignored
local.md: `write-schedule-config.mjs --enabled true --cadence daily --courses true`.
Flagget er VALGFRITT (opt-in inni opt-in) — utelates det, bevares en verdi satt
andre steder gjennom onboarding-rewriten (samme merge-semantikk som
interval_days / include_skill_lifecycle).
Tester (+3): --courses true setter nøkkelen, string-coercion (CLI-args er
strenger), og non-clobbering når flagget utelates. kb-update 313→316.
docs/development.md: C3-workflow peker nå på CLI-flagget framfor manuell local.md.
Live-probe (2) kjørt mot ekte Learn Platform API: baseline-registry etablert
(1093 kurs: 843 modules + 250 learning-paths), 0 leads (korrekt baseline §8 b).
Registry/report er detektorens gitignored private state — ingen filer committet.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 16:25:56 +02:00
f4dd4d3fb6
feat(ms-ai-architect): C3.6 — SessionStart-surfacing av kurs-leads (summarizeCourses) → C3 kurs-spor komplett (TDD)
...
Siste C3-fase. `summarizeCourses(report)` ren one-liner i detection-schedule.mjs
(«Kurs-signaler: N nye / M endrede kurs i dekkede produkter»; null ved
0/skipped/error/removed-only/malformed — removed er informasjons-signal, aldri
surfacet lead, spec §4.2). Speiler summarizeSkillLifecycle.
Wiring i session-start-context.mjs: read-only, leser
scripts/kb-update/data/course-detection-report.json, foreslår /architect:kb-update,
speiler skill-signaler-blokka. Hooken spawner ingenting for kurs-sporet.
docs/development.md: ny C3-workflow-seksjon (to-stegs: Claude-fri deteksjon →
SessionStart-surfacing → operatør-gate §3c). CLAUDE.md hook-tabell oppdatert.
Tester (+6): summarizeCourses — new+updated one-liner, only-new/only-updated,
zero→null, removed-only→null, skipped/error→null, missing/partial→null.
kb-update 307→313, validate 239/0, kb-eval 100/0, hooks 11/11, discovery 13/13.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 15:00:40 +02:00
e0d2d05dbb
feat(ms-ai-architect): C3.5 — courses-kolleksjon i decisions-io.mjs (UID-nøklet, Spor C) + kb-update §3c kurs-gate (TDD) [skip-docs]
...
Tredje ledger-kolleksjon (courses), additivt ved siden av decisions (URL,
Spor A) og actions (skill, Spor B). De tre rene helperne speiler
recordAction-trioen 1:1:
- recordCourseLead(led, uid, lead) (ren, UID-nøklet)
- setCourseLeadStatus(led, uid, status, at) (ren transisjon, kaster på ukjent UID)
- isCourseLeadDecided(led, uid) (dedup policy A: any status)
createLedger()->courses:{}; loadDecisions backfiller courses ??= {} (bakoverkompat).
Strukturell ingen-ingest-invariant: apply-pathene leser ALDRI courses
(apply-skill-op.mjs->kun actions, discover-new-urls.mjs->kun decisions),
så et godkjent kurs-lead trigger aldri fetch/transform/KB-skriving.
commands/kb-update.md §3c: operatør-gate som leser course-detection-report.json,
dedup'er via isCourseLeadDecided, skriver godkjente leads via recordCourseLead
(--dry-run viser leads uten å skrive).
Tester (+16): test-decisions-courses.test.mjs. Eksisterende test-decisions-io
+ test-decisions-actions URØRT grønne (ikke-regresjons-bevis, samme mønster
som Spor B). kb-update 291->307 · validate 239/0 · kb-eval 100/0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 14:38:56 +02:00
2e69e69326
feat(ms-ai-architect): C3.4 — detect-courses.mjs (binder C3.1–C3.3, LLM-fri) + selectDetectionSteps + include_course_detection (TDD) [skip-docs]
...
LLM-fri STEG 1-detektor for kurs-deteksjon (C3.4 av GODKJENT C3-spec). Speiler
discover-new-urls' to-stegs-monster: leser Keychain-creds, paginerer modules +
learning-paths filtrert til in-domain produkter, differ mot egen diff-state
(course-registry.json), skriver kandidatrapport. Skriver KUN report + registry —
ALDRI decisions.json (operator-gaten i C3.5 promoterer leads).
- scripts/kb-update/detect-courses.mjs (NY): detectCourses(deps) — injiserbar
kjerne (readSecret/getToken/paginate/loadTaxonomy/load+saveCourseRegistry/
saveReport/dataDir/now/log) -> hermetisk testbar uten Keychain/nett. Fail-soft
(spec 3/6): creds=null -> status:"skipped"; run-feil -> status:"error" (kaster
ALDRI); begge exit 0 (advisory, aldri rod pipeline). Tynn CLI med realpath-guard
(kjorer kun nar invokert direkte) + --data-dir test-seam. updatedAt.gt-cursor
KUN pa incremental (full ISO, gotcha #1 ); products-filter = comma-join (OR).
- lib/detection-schedule.mjs: ny ren selectDetectionSteps(config) gater BADE
skillLifecycle + courseDetection (en sannhetskilde). DEFAULT_SCHEDULE_CONFIG
+include_course_detection:false (opt-in i opt-in, spec 8d). coerce/serialize
utvidet. DETECTION_STEPS +{detect-courses, courseDetection:true}.
- run-detection.mjs: bruker selectDetectionSteps (fjerner duplisert filter-linje).
Tester (+22):
- test-detect-courses-invariant (8): ingen saveDecisions/decisions-io/atomic-write/
backup-import; skriver egen registry+report; binder diffCourses+makeCourseClassifier;
LLM-fri (kommentar-strippet kildesjekk).
- test-detect-courses (6): fail-soft skipped (alle/delvis creds), error-path (no
throw, registry urort), 4.3 report-shape + avledet skill/category, incremental
cursor/produkt-param, baseline=ingen leads (spec 8b), hermetisk exit-0-subprosess
via PATH-shadow av `security`.
- test-detection-schedule (+8): include_course_detection parse/serialize/default;
selectDetectionSteps-gating (default av, opt-in pa, uavhengige gates);
run-detection bruker selektoren.
Gotcha (secrets-hook): clientSecret: '...'-form traff llm-security-regelen
(client[_-]?secret|ClientSecret)\s*[=:]\s*['"]…{8,} -> lost med array-av-par
(feltnavn star aldri rett for quotet streng).
Gate 7 C3.4 mott: invariant + fail-soft(exit 0) + report-shape + DETECTION_STEPS-
filter gronn. kb-update 269->291, validate PASSED (239/0), run-detection dry-run
dropper detect-courses (opt-in av), eval urort (rorer ikke KB), null regresjon.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 14:24:57 +02:00
b9f51ea7b3
feat(ms-ai-architect): C3.3 — course_products (live-enumerert) + makeCourseClassifier (TDD) [skip-docs]
...
Produkt-slug->kategori-mapping for kurs-deteksjon (C3.3 av GODKJENT C3-spec).
- lib/taxonomy.mjs: makeCourseClassifier(tax) — speiler makeClassifier; forste
in-domain produkt vinner; skill AVLEDES fra category_skill (lagres ALDRI i
course_products -> kan ikke divergere); ukjent/tom/non-array -> null.
- data/domain-taxonomy.json: ny topp-niva course_products (slug->category) +
provenance. 15 in-domain live slugs.
- test-taxonomy.test.mjs (+6): atferd (in-domain->{skill,category}, first-wins,
out-of-domain/tom/non-array->null, manglende map) + REELL data-invariant
(hver slug-kategori resolver til skill, derivasjon matcher) + azure-openai-live.
ENUMERERING (gotcha #2 , live mot /api/v1/modules?products=<slug> server-side):
- DOD (0 treff): azure-ai-foundry, ai-services, azure-ai-services, foundry ->
Foundry/AI-services-kurs dukker opp under 'azure-openai'.
- Slug-feller bekreftet live: 'fabric' (ikke microsoft-fabric), 'entra' (ikke
microsoft-entra-id), 'azure-cosmos-db' (ikke cosmos-db), 'azure-cognitive-search'
(ikke azure-ai-search).
- 'azure-kubernetes-service' live men EKSKLUDERT (ingen AI-kategori -> stoy).
- Inkluderte (15): azure-openai, azure-machine-learning, azure-cognitive-search,
azure-cosmos-db, fabric, azure-databricks, microsoft-copilot-studio,
power-automate, power-apps, power-platform, ai-builder, microsoft-365-copilot,
microsoft-purview, entra, defender-for-cloud.
Avvik fra spec 4.4-eksempel: course_products lagrer slug->category (ikke
slug->{skill,category}); skill avledes — anti-divergens, encapsulated av
makeCourseClassifier (downstream-kontrakt {skill,category} uendret).
Gate 7 C3.3 mott: test gronn, eval --json IDENTISK (refTall/K-counts uendret).
kb-update 263->269, validate PASSED (239/0), null regresjon.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 13:48:04 +02:00
94c7f42128
feat(ms-ai-architect): C3.2 — course-diff (ren) + course-registry load/save (TDD) [skip-docs]
...
Pure diff/fold + run-mode selector for course detection (C3.2 av GODKJENT C3-spec).
- lib/course-diff.mjs (REN, null imports): normalizeCourse, selectMode,
isFullEnumDue, diffCourses, updateRegistry, FULL_ENUM_MAX_AGE_DAYS=30.
Full-enum-pin (§4.2): removed beregnes KUN i full-modus; inkrementell og
baseline gir removed:[]. Baseline emitterer ingen leads (§8 b).
updateRegistry ren (muterer aldri): incremental merger, baseline/full bygger
fra API-sett + dropper retirerte UIDs, stamper last_full_enum.
- registry-io.mjs +loadCourseRegistry/saveCourseRegistry (additivt, speiler
loadRegistry/saveRegistry; fil course-registry.json).
- test-course-diff.test.mjs (23) + test-courses-invariant (+3: diff-modul ren).
Gate §7 C3.2 møtt. kb-update 237->263, validate PASSED, null regresjon.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 13:12:49 +02:00
0390cc10ca
feat(ms-ai-architect): C3.1 — keychain + Learn Platform API-klient (TDD) [skip-docs]
...
C3 kurs-deteksjon, fase C3.1 (spec docs/c3-course-detection-plan.md §6/§7).
Claude-frie, fil-frie infrastruktur-lag for kurs-detektoren (C3.4):
- lib/keychain.mjs: readSecret() leser én Keychain-item via `security`-CLI,
fail-soft (manglende item / ikke-macOS → null). execImpl-DI for test.
- lib/learn-api.mjs: getToken (Entra client-credentials), paginate (async-gen,
følger nextLink), buildApiUrl (pinner api-version), buildUpdatedAtGt (kaster
på dato-only, canon Z — gotcha #1 ). Robusthetskontrakt §6: response.ok-sjekk
(fetch kaster ikke på 4xx/5xx), AbortSignal.timeout, 429/5xx-retry som
respekterer Retry-After, 4xx≠429 ikke-retry, fail-closed. fetchImpl/sleep-DI.
Tester (24, alle grønne): test-learn-api (token-body, buildUpdatedAtGt,
nextLink-paginering, produkt-param, alle robusthets-asserts), test-keychain,
test-courses-invariant (Claude-fri + skriver-ingen-filer). Live-probe (efemer)
grønn mot ekte Platform API m/ ekte creds: token + full-enum + inkrementell.
Intern infrastruktur (ingen brukervendt kommando/hook/atferd endret ennå —
surfacing + docs lander i C3.6). kb-update 213→237 · validate 239 · null regresjon.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 12:59:16 +02:00
215437cb5d
docs(ms-ai-architect): C3 §8 besluttet (delegert) — spec GODKJENT, +fetch-robusthetskontrakt +removed full-enum-pin [skip-docs]
...
Operatør delegerte de 4 åpne beslutningene (mandat: profesjonell, til å stole på). Alle besluttet; (a) fetch fikk binding robusthetskontrakt (response.ok/timeout/429-Retry-After), (c) removed pinnet til full-enum-kjøringer (last_full_enum-kadens) for å unngå falsk-positiv flom. §7-gatekriterier for C3.1/C3.2 utvidet. Neste = C3.1 (TDD).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 12:42:22 +02:00
7d9430b7a4
docs(ms-ai-architect): C3-spec — kurs-deteksjon via Learn Platform API (TIL GODKJENNING) [skip-docs]
...
Forankret i verifisert API-grunnlag (spike, S29) + lest eksisterende arkitektur:
to-stegs som discover-new-urls (detektor skriver rapport+course-registry.json,
ALDRI decisions.json; gaten skriver leads), ny UID-nøklet courses-kolleksjon i
ledger, produkt-slug->skill i domain-taxonomy.json, DETECTION_STEPS-steg gated av
include_course_detection. Faseplan C3.1-C3.6 m/ kjørbart gate-kriterium per fase.
4 åpne beslutninger flagget m/ anbefaling (§8). STATE -> operatør-review neste.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 12:27:34 +02:00
792986820b
docs(ms-ai-architect): C3 Fase 0 — Learn Platform API auth-oppsett + spike kartlagt; STATE → spec neste [skip-docs]
...
Sesjon 29: Platform API-beslutning (vs legacy/MCP), Entra app-only registrert
i privat tenant, creds i Keychain (secret-utløp ~2028-06), auth verifisert grønn.
Full API-kontrakt + 2 kritiske gotchas (updatedAt.gt krever full ISO; produkt-
slug azure-ai-foundry død) dokumentert i docs/c3-course-detection-spike.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 12:09:19 +02:00
bf10b7dca7
docs(ms-ai-architect): 1.16.0 release-notater — dokumentér C1+C2 + ferske testtall
...
v1.16.0
CHANGELOG [1.16.0] og README version-history dekket bare audit-arbeidet
(#7c/#7d). Lagt til Spor C-selvstendiggjøring som ogsaa shipper under 1.16.0:
- C1 planlagt deteksjon (opt-in, Claude-fri; Tier 1 hook + Tier 2 OS-scheduler)
- C2 onboarding-redesign (bruker-eid lagring, ambient injeksjon, fritekst-felt,
scheduler-kadens i onboarding, privat-sektor-paritet med regresjonsvakt)
Dato 2026-06-18 -> 2026-06-22 (release-dato). Ferske testtall: kb-integrity
115/115 -> 192/192, + onboarding-parity 14/14.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 19:53:01 +02:00
c4d434f9e9
test(ms-ai-architect): C2.4 lås K4 privat-sektor-paritet (regresjonsvakt) + omdøp feildøpt doc [skip-docs]
...
C2 KOMPLETT (C2.1->C2.4). C2.4 var verifikasjon, ikke nybygg: privat-greinen
i onboarding kom i 6e1fc6d (FOER C2.1), saa audit §167-onboarding-residu var
allerede lukket i kode. Denne oekta beviser + laaser det.
- tests/test-onboarding-parity.sh (NY): 14 asserts mot KILDEN
(onboarding-agent.md Phase 1; onboarding er interaktivt AskUserQuestion ->
ingen output-fixture). Dekker sektortype-forgrening, privat sektor-grein
(bank slipper «Annet»), privat reg-sett (DORA/Finansforetaksloven/
Finanstilsynets IKT-forskrift/Verdipapirhandelloven/Hvitvaskingsloven), og
at private aldri spoerres Offentleglova/Arkivloven. TDD roed->groenn:
strippet offentlig-only-kopi -> 13/14 FAIL; ekte fil -> 14/14 PASS.
- tests/run-e2e.sh: wiret --onboarding (med i --all).
- §167 (d) bevisst IKKE bygget: «egen dataklassifiserings-taksonomi for privat
Fase 3» er gull-plating utenfor K4 (dagens taksonomi er alminnelig norsk
bedrifts-klassifisering; privat fullfoerer Fase 3 uhindret).
- Omdoept feildoept docs/onboarding-ros-analysis.md ->
docs/windows-clone-to-pr-ros-guide.md (Windows clone-to-PR-bidragsyterguide,
ikke onboarding-analyse); plan+brief-ref oppdatert.
Verifisert: onboarding-parity 14/14 (NY) · validate 239/0/0 · e2e alle suiter ·
discovery 13/13 · test-hooks 11/11 · kb-integrity 192/192 (220 baseline-warns) ·
gitleaks 3 PRE-EKSISTERENDE (playground/vendor/).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 17:39:11 +02:00
afd75c4fed
feat(ms-ai-architect): C2.3 onboarding skriver scheduled_detection cadence+enabled via gated CLI (TDD) [skip-docs]
...
K5 oppfylt: onboarding skriver scheduled_detection-blokka (enabled +
os_scheduler_cadence) til bruker-eid config; parseScheduleConfig leser den
tilbake til samme verdier (round-trip bevist deterministisk).
- serializeScheduleConfig(config) i detection-schedule.mjs — invers av
parseScheduleConfig, rett ved parseren (én formatsannhet).
- write-schedule-config.mjs (NY, gated CLI, Claude-fri): merger på eksisterende
config (override kun de to onboarding-eide nøklene; interval_days/
include_skill_lifecycle overlever). backupFile + atomicWriteSync — ingen rå
fs-write.
- backupFile(filePath, backupRoot) i lib/backup.mjs — presis enkeltfil-backup.
- onboard.md (orkestrator): «Planlagt deteksjon»-seksjon + scheduler i --status.
onboarding-agent.md: note om at scheduler er orkestratorens jobb (ingen Bash).
- Avvik fra plan-tekst (dokumentert): scheduler-spørsmål i orkestrator, ikke agent.
Verifisert: detection-schedule 33/33 (+10) · backup-restore 15/15 (+3) ·
kb-update 213 · kb-eval 100 · validate 239/0/0 · test-hooks 11/11 ·
kb-integrity 192/192 · discovery 13/13 · gitleaks 3 pre-eksisterende.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 14:53:03 +02:00
8ff73b7fe3
feat(ms-ai-architect): C2.2 valgfritt fritekst-felt free-context.md i onboarding (TDD) [skip-docs]
...
Spor C / C2.2 (#3 , akseptanse K3): fanger et fritt prosa-felt i onboarding og
overflater det (kappet) ambient i hver sesjon.
- lib/user-data.mjs: FREE_CONTEXT_FILE (utenfor ORG_FILES — valgfri, teller ikke
mot fullføring), collapseProse() surfacer fri kontekst som ÉTT felt uansett
markdown-struktur (ingen stille drop), capValue() ekstrahert (DRY).
- session-start-context.mjs: leser free-context.md valgfritt (ingen count++).
- onboarding-agent.md: ny Phase 6 (valgfri); onboard.md: prosess/Task/status.
- 11 agenter: uniform 6. bullet (grep 11/11).
- Tester FØR kode: user-data 25/25 (+9), test-hooks 11/11 (+1 K3-ambient).
Gates: validate 239/0/0 · kb-update 200 · kb-eval 100 · kb-integrity 192/192
(220 baseline-warns) · discovery 13/13 · gitleaks 3 pre-eksisterende.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 14:16:00 +02:00
466094f2a2
feat(ms-ai-architect): C2.1 onboarding skriver bruker-sti + 11-agent fallback + docs [skip-docs]
...
- onboard.md (orkestrator): resolver absolutt $ORG_DIR via Bash + mkdir -p, gir
agenten stien. allowed-tools +Bash. Status/resume globber bruker-sti.
- onboarding-agent.md: skriver de 5 org-filene til den absolutte bruker-stien
(~/.claude/ms-ai-architect/org/), aldri plugin-rot.
- 11 org-bevisste agenter: uniform Virksomhetskontekst-blokk -> bruker-sti +
note om ambient injeksjon + subagent-fallback (grep-verifisert 11/11).
Risiko 1 BEVIST: Task-subagent arver IKKE SessionStart-injeksjon; Read/Glob
ekspanderer ~ -> fallback lesbar uten Bash.
- README + plan: sti-referanse + C2.1-resultat. CLAUDE.md uendret (ingen sti-ref).
Verifisert: validate PASSED · kb-integrity 192/192 · discovery 13/13.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 13:34:19 +02:00
dc0b627e98
feat(ms-ai-architect): C2.1 lib/user-data resolver + ambient org-injeksjon + C1 config bakoverkompat (TDD) [skip-docs]
...
Bæreren i C2 onboarding-redesign (#26 ). TDD: test FØR kode.
- lib/user-data.mjs (NY, ren, SKRIVER ALDRI; kun node:os/path):
resolveUserDataDir/resolveOrgDir/resolveConfigPath peker ~/.claude/ms-ai-architect/
(uavhengig av pluginRoot -> overlever reinstall, K2). CONFIG_FILENAME delt med C1
(en sannhetskilde). buildOrgSummary: deterministisk, lengde-kappet H2-ekstraksjon.
- detection-schedule.mjs: loadScheduleConfig(pluginRoot, home=homedir()) leser
bruker-sti FORST, fallback plugin-rot. Lokal CONFIG_FILENAME -> importeres fra resolver.
Alle 3 kallere bruker ett-arg-kall (uendret oppforsel).
- session-start-context.mjs: injiserer buildOrgSummary ambient (K1) som egen
Virksomhetskontekst-blokk; status-nudge beholdt nar org tom.
Verifisert: user-data 16/16 · detection-schedule 23/23 · test-hooks 10/10 ·
kb-update 191 · kb-eval 100 · validate PASSED.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 13:34:05 +02:00
4ff60803ce
docs(ms-ai-architect): C2 onboarding-redesign — godkjent plan + roadmap [skip-docs]
...
Plan-sesjon for Spor C fase C2. Forankret mot koden (ikke briefen alene):
- gap #1 ambient (hook injiserer status, ikke innhold; 11 agenter leser org/ betinget),
#2 overlevelse (org/ OG ms-ai-architect.local.md gitignored i plugin-dir), #3 fritekst
er REELLE; #4 privat-paritet trolig allerede løst i onboarding-agent.md (verifiseres C2.4).
- Besluttet lagring (operatør 2026-06-22): ~/.claude/ms-ai-architect/ for org + C1-config,
overlever reinstall; bakoverkompat (bruker-sti → fallback plugin-rot).
- Sekvens: C2.1 lagring+ambient → C2.2 fritekst → C2.3 cadence/enable i onboarding (S24)
→ C2.4 verifiser paritet. TDD test FØR kode hver delsesjon.
docs/onboarding-redesign-plan.md (godkjent plan, avløser briefen). STATE «👉 NESTE» → C2.1.
Tasks #45–48 opprettet; #26 in_progress.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 12:08:28 +02:00
071601bb9e
feat(ms-ai-architect): Sesjon 24 — C1 Tier 2 lokal launchd-scheduler (deteksjon-only, ToS-trygt) [skip-docs]
...
Tier 1 (SessionStart-hook) kjører deteksjon kun når en Claude-sesjon starter.
Tier 2 installerer en lokal launchd LaunchAgent som fyrer SAMME Claude-frie
entrypoint daglig (kl. 03:00), uavhengig av sesjoner = ekte bakgrunn mellom
sesjoner. ToS-trygt: entrypointet kan strukturelt ikke invokere claude.
Søk-først-verifisert (2026-06): launchd > cron (Apple-anbefalt; cron krever
Full Disk Access); StartCalendarInterval fanger opp etter dvale; launchd har
minimalt PATH + ekspanderer ikke ~; process.execPath = Cellar-sti som dør ved
`brew upgrade node` → plistens PATH inkluderer /usr/local/bin.
Levert (TDD, test FØR kode):
- lib/launchd-plist.mjs (REN, SKRIVER ALDRI): renderPlist (XML-escape,
StartCalendarInterval, PATH-fix), defaultLabel, resolvePaths.
- scheduler.mjs (TYNN CLI): install|uninstall|status|run-now|print|run.
Strukturelt Claude-fri (kun process.execPath på run-detection.mjs +
launchctl; kilde-grep-testet). run gater på os_scheduler_cadence →
delegerer til run-detection.mjs. uid-0-nekt; idempotent bootout.
- detection-schedule.mjs (additiv, Tier-1 urørt): os_scheduler_cadence
('daily' default | 'interval') + daysSinceLastPoll ren helper.
- commands/kb-update.md: Tier-1/Tier-2-doc + caveats (uninstall=pause;
re-install etter node-upgrade).
Operatør-valg: daglig default, kadens egen innstilling (settes i onboarding/C2).
Verifisert: launchd-plist 13/13 · detection-schedule 21/21 · kb-update 173 ·
kb-eval 100 · validate 239/0 · test-hooks 6/6 · plutil -lint OK · live
install→status→idempotent→uninstall på maskinen (gui/501, rent).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 19:59:18 +02:00
f8a160585f
test(ms-ai-architect): Sesjon 23 — auto_discover stale-felt assertion korrigert (søk-verifisert, 13/13) [skip-docs]
...
Oppgave 0 (#44 ): søk-først (claude-code-guide mot offisiell docs) verifiserte at
`auto_discover` IKKE er et gyldig Claude Code plugin.json-felt — auto-discovery er
implisitt default (code.claude.com/docs/en/plugins-reference; ukjent felt gir kun
valideringsadvarsel, ikke feil). → stale konvensjon, IKKE manglende felt.
- tests/test-plugin-discovery.sh: stale hard-assertion (krevde `auto_discover: true`)
→ optional-felt-logikk som speiler validate-plugin.sh (fravær = PASS «auto-discovery
implisitt»; present må være true). plugin.json URØRT (la IKKE til ugyldig felt).
12/13 → 13/13.
validate 239/0 (ingen regresjon). STATE oppdatert: NESTE = C1 Tier 2.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:48:40 +02:00
039b61ca24
chore(ms-ai-architect): Sesjon 22 — rydd stale pre-edit-secrets-testreferanser [skip-docs]
...
pre-edit-secrets.mjs-hooken ble bevisst fjernet i v1.7.0 (secrets scanning
consolidated to llm-security, CHANGELOG l.413), men 2 testfiler refererte den
fortsatt og ga falske feil.
- tests/test-hooks.sh: fjernet pre-edit-secrets-testblokk (5 tester) → 6/6 grønn.
- tests/test-plugin-discovery.sh: fjernet pre-edit-secrets fra CLAUDE.md-dok-loop.
Separat funn (IKKE fikset, scope-guard): test-plugin-discovery.sh har 1
gjenværende feil `auto_discover is not true` — plugin.json mangler feltet; ikke
hook-relatert, krever søk-først (gjeldende felt vs stale test). Flagget → task #44 .
De 4 sporede suitene uendret (validate 239 · kb-update 155 · kb-eval 100 · kb-integrity 192/192).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 23:08:11 +02:00
150b20584e
feat(ms-ai-architect): Sesjon 21 — C1 Tier 1 opt-in session-forankret deteksjon (ToS-forankret) [skip-docs]
...
Spor C fase C1 Tier 1. Ny verifisert ToS-analyse avdekket falsk «enten/eller»:
Consumer Terms §3.7 begrenser automatisert tilgang til Claude/Anthropic, IKKE
kjøring av lokale node-scripts. Deteksjon kontakter aldri Claude → utenfor
ToS-flaten; apply (eneste Claude-steg) forblir manuelt/in-session/gated.
- lib/detection-schedule.mjs (ren): opt-in config (default AV) + shouldRunDetection
gate + DETECTION_STEPS allow-liste + summarizeSkillLifecycle. Zero-dep parser.
- run-detection.mjs: Claude-FRITT entrypoint — kjører kun `node` på de
allow-listede deteksjons-scriptene; kan ikke invokere claude (guard-testet).
- session-start-context.mjs: ubetinget bakgrunns-spawn → opt-in (default AV
spawner ingenting) + surfacer skill-signaler read-only.
- commands/kb-update.md: opt-in-seksjon + ToS-note; ms-ai-architect.local.md.example.
TDD: ny test-detection-schedule.test.mjs (16). kb-update 139→155.
Suiter uendret: validate 239 · kb-eval 100 · kb-integrity 192/192.
0 skills/-mutasjon. Tier 2 (lokal OS-timer, deteksjon-only) = neste økt.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 22:54:18 +02:00
e47fc9bd59
feat(ms-ai-architect): Sesjon 20 — B3 create_skill (dvelende, konstruktiv op) [skip-docs]
...
B3 + Spor B (krav 5+6) KOMPLETT. create_skill er speilbildet av de
destruktive ops: merge/saner/retire beviser "ingen kuratert verdi TAPT";
create beviser "ingen sub-bar skill FØDT" (kvalitetsgulv). Ingen ny
domene-skill shippet (svar 3) — mekanismen bevist, ikke brukt.
- planCreateSkill (ren): genererer scaffold + selv-validerer mot eval.mjs
sine EGNE checkers (K2/K3/K5/K6/refTall + K10) — rubrikken har én kilde.
Guardrail ok iff alle deterministiske K passerer + K10<terskel + navn ledig.
- TEST_DOMAIN_SPEC: kanonisk dvelende-scaffold (born compliant, K5 ratio 1.0).
- runCreatePlan (uren): gated dry-run, 0 skriving til skills/.
- applyApprovedAction create-gren: re-plan fersk → revalider (drift+kollisjon)
→ skriv scaffold + persister taksonomi-tillegg → flipp ledger.
- applyCategoryAdditions (taxonomy.mjs): additiv, klobrer aldri eksisterende eier.
- CLI create-verb i plan-skill-op + apply-skill-op.
TDD: ny test-skill-ops-create.test.mjs (16). kb-eval 84→100.
Suiter uendret: validate 239 · kb-update 139 · kb-integrity 192/192.
Deterministisk eval K1–K10 for de 5 ekte: 0 regresjon. 0 ekte skills/-mutasjon.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 21:37:19 +02:00
de3a9a483b
feat(ms-ai-architect): Sesjon 19 — B3 merge-apply (cross-skill + taksonomi-persist) [skip-docs]
...
Merge-apply = den tyngste destruktive op-en: eksekver en operatør-godkjent
merge_skills-entry → faktisk cross-skill skills/-mutasjon. Tre mekanismer
som sanitize/retire ikke trengte: kuratert relokasjon (ikke arkiv),
taksonomi-persistering, retire-av-absorbert.
- taxonomy.mjs (ny persist): saveTaxonomy (atomisk .tmp+rename, speiler
saveDecisions) + ren applyCategoryReassignments (repointer KUN der eier
=== from; absent/allerede-flyttet = no-op). Lag-0 er normalt read-only;
ENESTE writer = gated merge-apply.
- applyApprovedAction merge-gren (skill-ops.mjs): re-plan fersk → revalidér
(kollisjon → guardrail.ok=false → abort) → flytt absorbed-refs → absorber
(moveFile; flyttingen ER bevaringen set-equality beviser) → persister
taksonomi-repoint fra FERSK plan (drift-sikker) → arkivér absorbed-SKILL.md
FØR rmdir → flipp ledger approved→applied. Description-forsoning forblir
MANUELL (planner-kontrakt: apply rører aldri absorber-SKILL.md).
archiveMove→moveFile (generisk: arkiv + kuratert flytt).
- CLI apply-skill-op.mjs merge <absorber> <absorbed> — lookup via actionKey
(merge_skills:<sortert par>); default PREVIEW, --apply = dobbel-gate.
TDD, tmpdir-fixtures: 0 ekte skills/-mutasjon. Ny test-skill-ops-merge-apply
(7) + 2 taksonomi-tester; fjernet foreldet merge-throws fra S18-fila. Tester:
kb-eval 78→84, kb-update 137→139; validate 239 · kb-integrity 192/192 uendret.
eval --json deterministisk uendret (K10 eng+infra FAIL, øvrige PASS).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:54:13 +02:00
4ac18a76c8
feat(ms-ai-architect): Sesjon 18 — B3 apply-path (sanitize+retire), merge→S19 [skip-docs]
...
Apply-path = den destruktive frontieren: eksekver en operatør-godkjent
(status:approved) ledger-entry → faktisk skills/-mutasjon. Staget per
operatør-beslutning til single-skill ops (sanitize+retire); merge-apply
isoleres til S19 (krever taksonomi-persistering + cross-skill flytt).
- revalidateApply (ren, skill-ops.mjs): idempotent revalidering mot fersk
re-plan — nekter ved status≠approved, op-mismatch, fersk guardrail≠ok,
eller drift (isDeepStrictEqual fresh vs approved guardrail-snapshot).
- applyApprovedAction (impur): arkiver-så-slett (rename skills/…→archive/…
atomisk; retire rmdir'er tom katalog sist) + flipp ledger approved→applied.
apply:false = preview (0 mutasjon). merge_skills → throw (S19).
- setActionStatus (ren, decisions-io.mjs): ledger status-transisjon, bevarer
targets+guardrail, audit-record beholdes.
- CLI apply-skill-op.mjs {list|sanitize|retire} — default PREVIEW, --apply =
dobbel-gate utover ledger-approved.
TDD, tmpdir-fixtures: 0 ekte skills/-mutasjon. Tester: kb-eval 66→78,
kb-update 132→137; validate 239 · kb-integrity 192/192 uendret.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 20:32:51 +02:00
f7b622b318
feat(ms-ai-architect): Sesjon 17 — B3 sanitize_skill + retire_skill dry-run-planners [skip-docs]
...
Speiler S16 merge-mønsteret: rene planners (leser ingen disk, anvender
ingenting) + impurt skall med gated --write. 0 skriving til skills/.
Intern kb-eval maintenance-tooling — ingen brukervendt /architect-kommando.
- planSanitizeSkill: fjerner KUN dødt innhold (kb-integrity orphan/dead-path).
Guardrail refuserer fjerning av kuratert/manglende innhold (illegalRemovals/
missingRemovals MÅ være tom). Dateless = kuratert, behandles ikke her.
- planRetireSkill: hel-skill m/ obligatorisk arkivering; guardrail refuserer
hard delete (--hard -> archiveDir=null, ok=false). taxonomyOrphaned flagget.
- loadSkillOrphans (read-only) + runSanitizePlan/runRetirePlan (gated).
- CLI plan-skill-op.mjs utvidet: {sanitize|retire} <skill> [--hard].
Ekte dry-runs: sanitize ms-ai-security 62/33 orphans OK · retire
ms-ai-infrastructure 35 arkivert OK · --hard FAILED (blokkert). git clean.
TDD: test-skill-ops-sanitize-retire.test.mjs (16). kb-eval 50->66.
Baseline uendret: validate 239 · kb-update 132 · kb-integrity 192/192.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 17:45:37 +02:00
f03a0e08b2
feat(ms-ai-architect): Sesjon 16 — B3 ledger action-lag + merge_skills dry-run-planner
...
Spor B / B3 start. Operatør-gated dry-run for skill-livssyklus, merge først.
- decisions-io.mjs: additivt skill-nøklet `actions`-lag ved siden av urørt
URL-nøklet `decisions` (14 URL-tester urørt = regresjonsbevis). version=1,
loadDecisions backfiller manglende actions-nøkkel. Nye rene fn: actionKey
(merge symmetrisk på paret), isActionDecided, recordAction (no-mutate),
listActions. Policy A gjelder også actions.
- scripts/kb-eval/lib/skill-ops.mjs: ren planMergeSkills → {entry,diff,guardrail},
leser ingen disk, anvender INGENTING. Guardrail = ingen kuratert verdi tapt
(count-invariant + set-equality + kollisjons-deteksjon; ok=false ved klobring).
Impur skall loadSkillRefs/runMergePlan + CLI plan-skill-op.mjs (gated --write).
- Ekte eng↔infra dry-run: guardrail OK (34+153=187, 0 kollisjoner), 153 fil-flytt
+ 7 taksonomi-reassign + retire eng; 0 skriving til skills/, ledger uendret
(retning er operatør/judge-valg, ikke pushet gjennom gaten).
- TDD: test-decisions-actions (10) + test-skill-ops-merge (10, inkl. byte-for-byte
skills/-snapshot som no-write-bevis). kb-eval 40→50, kb-update 122→132.
Regresjon grønn: validate 239, kb-integrity 192/192.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 17:10:33 +02:00
ba597eb988
feat(ms-ai-architect): Sesjon 15 — B2 K10 søsken-scope-ikke-overlapp
...
- Refaktor: overlap-kjerne flyttet til scripts/kb-eval/lib/sibling-overlap.mjs
(bryter sirkulær import eval.mjs<->detect); detect re-eksporterer → B1-tester urørt
- K10 = søsken-scope-ikke-overlapp, deterministisk cross-skill: perSkillSiblingOverlap
+ attachSiblingOverlap i eval.mjs. combined = boundaryTension + df-vektet leksikalsk;
per-skill verdikt = verste søskenpar; terskel 7.0 (naturlig gap 7.42→6.67)
- Empirisk (alle 5): eng+infra FAIL (7.42 mot hverandre), advisor/gov/sec PASS
→ eng↔infra-signal mater B3 merge/saner (ikke blokkering)
- Gated baseline-regen via --write (descriptions urørt → judge K1/K4/K7/K8/K9 merget
uendret, ikke fabrikkert); rubric K1-K10
- TDD: +9 tester (tests/kb-eval/test-k10-sibling-overlap.test.mjs), kb-eval 31→40
- 0 skriving til skills/. Suiter: validate 239 · kb-update 122 · kb-integrity 192/192
2026-06-20 11:59:59 +02:00
5ad4ed025c
feat(ms-ai-architect): Sesjon 14 — B1 fullført (coverage/gap + bloat/stale) [skip-docs]
...
Utvider scripts/kb-eval/detect-skill-lifecycle.mjs med to deterministiske
detektorer (B1 nå komplett, 3 seksjoner i skill-lifecycle-report.json).
Skriver ALDRI til skills/ — kun rapport; kandidater mater decisions.json + gate (B3).
Intern kb-eval-tooling: ingen brukervendt kommando/agent/skill/hook endret.
Detektor 2 — coverage/gap (innen-domene): taksonomi category_skill (deklarert
eierskap) vs fysisk disk-mappetelling. Klasser gap/thin/orphan/misowned.
Empirisk: 21 deklarerte kat, 20 dekket, 1 gap (security-scoring — deklarert
men ingen disk-mappe; innhold bor i ai-security-engineering = fantom-rutekat),
2 tynne (development=1, platforms=5).
Detektor 3 — bloat/stale (per skill): K3-margin (eval.checkK3 body vs 500) +
dateless ref-andel (mangler Last updated:-header = uverifiserbar ferskhet).
Disk-only/deterministisk; poll-avledet staleness (change-report) bevisst utenfor.
Empirisk: 0 split-kandidater, 1 saner (ms-ai-governance 4/78 dateless).
TDD: 8 nye tester (coverage 4, stale-primitiv 1, bloat 3). kb-eval 23->31.
Gate: validate 239, kb-update 122, kb-eval 31, kb-integrity 192/192 — grønn.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
2026-06-20 11:34:57 +02:00
2665a3a2d8
feat(ms-ai-architect): Sesjon 13 — B1 overlap-detektor (skill-livssyklus)
...
Spor B fase B1, første detektor (lag-1-analog på SKILL-granularitet).
PRODUSERER KUN RAPPORT — skriver aldri til skills/ (invariant bekreftet).
Detektor (scripts/kb-eval/detect-skill-lifecycle.mjs) kombinerer to
deterministiske overlapp-signaler per skill-par:
- grensetension: operatør-kuratert k1-trigger-prompts.json belongs_to-graf
(out_of_domain = håndmerkede confusable-naboer), symmetrisk telt
- df-vektet leksikalsk trigger-surface-overlapp (1/df nedvekter domene-
vanlige ord som «azure»; format-boilerplate «triggers» filtrert)
combined = grensetension + weightedScore.
Empirisk: eng↔infra topper (combined 7.42, tension 6, delt: architecture/
azure/data/multi) — operatørens Azure-deployment-grenseinstinkt bekreftet.
Surfaces som focusPair (operatør-utpekt B1-mål).
CLI: default human-summary · --json · --write (rapport gitignored som de
andre deteksjonsrapportene; detektor + kuraterte inputs er tracked).
TDD: 8 nye tester i tests/kb-eval/ (tokenize, surface, df, lexical, pairKey,
tension differensial-sjekk, full compute m/determinisme). Gate møtt.
Ingen regresjon: validate 239 · kb-update 122 · kb-eval 23 (15+8) · kb-integrity 192/192.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
2026-06-20 11:17:19 +02:00
e8ceb7a8b4
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
2026-06-20 11:09:11 +02:00
c778cf6cd2
fix(ms-ai-architect): Sesjon 12 — lukk SPOR A, ny eval-baseline (K1–K9 grønn alle 5)
...
Regenerert eval-baseline.json via gated `eval.mjs --write` så baselinen fanger
S9+S10+S11 judge-verdiktene (var pre-S9). Eneste endrede artefakt: baseline-fila
(123+/128−, ren regenerering — judge-felt null→populert fra data/judge-results.json).
Verifisert FØR skriving (read-only) og i resultatet:
- judge-cache: K1/K4/K7/K8/K9 PASS alle 5 (advisor K8=0.8 at-threshold, pass)
- deterministisk: K2/K3/K5/K6/refTall PASS alle 5
- ny baseline: 0 åpen FAIL K1–K9 på alle 5 skills, judge populert alle 5
SPOR A (krav 1–4) er nå komplett: K1 autoritativ+blindet (S11), 6×5 kanonisk (S8),
K4+K9 body-cleanup (S9 sec+gov, S10 eng+infra), skill-optimalisering refTall+K5 (S7).
eval-baseline.json er sannhetskilden og grønn på K1–K9.
Ingen regresjon: validate 239 · kb-update 122 · kb-eval 15 · kb-integrity 192/192.
NESTE: Spor B (scheduled deteksjon · kurs-spor #25 · low-currency · onboarding #26 ).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
2026-06-20 10:11:45 +02:00
c1f75f9c78
fix(ms-ai-architect): Sesjon 11 — K1 trigger-presisjon, blindet judge PASS alle 5
...
(a) 2 description-fikser (operatør-godkjent):
- governance: +Schrems II/TIA-trigger (recall-gap 0.85→1.0; governance eier
domenet — 20 ref-filer + data-residency-audit-monitoring.md)
- advisor: strammere — selection-forankret + eksplisitt negativ scope
(NOT for build/secure/operate/legally-assess); fjernet bred
"Microsoft AI architecture"-trigger som kolliderte med søsken
(b) Kuratert testsett + mekanikk:
- ny data/k1-trigger-prompts.json (100 prompts: 10 in + 10 adversarielt out/skill)
- judge-prompt.md K1: generer→konsumer kuratert sett + nytt skjema
(inDomainHitRate/outDomainFalsePositiveRate/pass/misclassified, provisional=false)
- blindet måling: 5 Opus-dommere ser kun description + 20 stokkede umerkede
prompts; ground-truth scoret deterministisk utenfor dommeren
Resultat: K1 PASS alle 5 — hit 1.0 / fp 0.0 / presisjon 1.0 / 0 miss.
Begge fikser validert i dommer-begrunnelsene. K2 fortsatt PASS.
Ikke regredert: validate 239 · kb-eval 15 · kb-update 122 · kb-integrity 192/192.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
2026-06-20 10:00:47 +02:00
6b3c44adc3
fix(ms-ai-architect): Sesjon 10 — K9-destale eng+infra (volatil status → ref)
...
Begge S10-kriterier møtt (operatør-gated kald LLM-judge): engineering K9 PASS,
infrastructure K9 PASS. Deterministisk ikke regredert: validate 239 · kb-eval 15
· kb-update 122 · kb-integrity 192/192. K4 hevet 4→5 begge skills.
Engineering: modellversjoner (GPT-4o/Whisper/Florence/text-embedding-3) →
generisk kapabilitets-framing; MAF-«erstatter SK»-transisjon + Foundry Agent
Service GA → pekere; «Start med GPT-4o» (ABSENT i ref) droppet.
Infrastructure: SLA-tabell (ABSENT i ref) → relativ-veiledning + MCP-peker;
RTO/RPO-tabell → sammendrag + peker (ref bærer hele tier-modellen); «peak+30%»
(ref sier 20%) → generisk; Phi-3/Phi-4 + parametertall → «Phi-familien»
(fjernet faktafeil «Phi-4 14B»).
Metode: read-only verifiserings-agenter kartla ref-dekning FØR sletting.
judge-results.json oppdatert med ferske kalde eng+infra-verdikter (_updated: S10).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
2026-06-20 09:31:21 +02:00
a9ff401b6e
docs(ms-ai-architect): Sesjon 9 SPOR A-resultater i roadmap + STATE
...
Sesjon 9 RESULTATER i roadmap (metode, per-skill-endringer, S10-binding)
+ S9-rad i PLANLAGT-tabellen merket FERDIG. STATE peker paa Sesjon 10
(K9-destale engineering + infrastructure) som neste.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
2026-06-20 07:37:12 +02:00
c4230d2e88
fix(ms-ai-architect): Sesjon 9 - K4+K9 body-cleanup security + governance
...
Tynner duplisert/volatil body-info i de to skills som feilet begge
kriterier, til pekere mot kanoniske ref-filer. Fersk operatør-gated
LLM-judge: security K4 5/5 + K9 PASS; governance K4 5/5 + K9 PASS.
Security (K9): Defender GA/preview/Azure-Gov-status, §3-ytelsestall,
GPT-4o-par og PTU break-even ut av body. Uverifiserte tall (20-50ms,
5-10x, 80% latens — fantes i ingen ref) droppet, ikke flyttet.
Security (K4): risikoklassifiserings-tabellen (divergerte fra rubrikk:
6 band vs 5, manglet Uakseptabel) + P10/P50/P90-tabellen (flat x0.6/x1.8
motsa kanonisk per-komponent-modell, agentens OBLIGATORISK-kilde) ->
peker. Antakelse-test bestaatt: ingenting asserter body-tallene.
Governance (K9): EU Data Boundary §2.3 - droppet volatile regioner
(Sweden Central/West Europe; body motsa refs som sier Norway East/West
Europe), repek kryss-ref til gdpr-compliance-ai-systems.md.
Governance (K4): §6.2 AI Act-tre - kollapset oppramsede (og ufullstendige)
Art.5 + Annex III-lister til pekere mot ai-act-classification-methodology.md;
§2.1 eneste oversiktstabell.
judge-prompt.md K9 strammet: stabile identifikatorer (forordningsaar,
OWASP 2025, MADR v3.0, saksnr) eksplisitt ute av scope. judge-results.json
oppdatert med ferske sec+gov-verdikter.
Gates: validate 239 · kb-eval 15 · kb-update 122 · kb-integrity 192/192.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
2026-06-20 07:37:03 +02:00