Oppdatert run-brief etter at critical (41b390b) + high (25bcb74) er ferdige:
- Status: critical+high FERDIG; medium (~74) + low (~51) PLANLAGT i nye sesjoner.
- Ny seksjon «Metode (evidensbasert): DELEGER store bøtter» — dokumenterer det
beviste mønsteret fra high-bøtta: grupperte Opus-subagenter (~6 filer/gruppe,
delt kilde), subagent-kontrakt (verifiser mot kilde, aldri commit), og
hovedkontekst-verifisering etter (git-diff + validate + kb-integrity + gitleaks
+ single-commit). Erstatter den opprinnelige «main-context»-antakelsen, som ikke
skalerer (Learn-sider 50KB+, medium+low = ~268 unike fetches).
- Sesjonsplan M (medium) + L (low) med fil-/fetch-/gruppe-estimater.
- Antall subagenter ikke en begrensning (operatør-godkjent) — split styres av
hovedkontekstens verifiseringslast, ikke agent-antall.
- Re-poll FØRST hver sesjon (klassifisering drifter med fil-alder).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
Eneste gjenstående post etter v1.16.0 (audit #5–#9 komplett). Fokusert
run-plan som komplementerer commands/kb-update.md med beslutninger/kontekst
spesifikt for denne kjøringen: hvorfor fersk sesjon (kjører i hovedkontekst,
~80 fetches uten subagent-isolasjon), anbefalt kjøring, beslutningspunkter,
push-vindu-timing, post-run telling-resync, og testbar verifisering.
Pekt til fra STATE.md (gitignored). Per kontinuitets-regel: planer/briefer
bor i docs/ ved siden av staten.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
Phase B (M-items) av #8 currency-rest. Nytt innhold, verifisert mot
Microsoft Learn + OWASP GenAI 2026-06-18 (tre research-subagenter).
Begge nye KB-filer wiret i SKILL.md (de-orphan bekreftet: kb-integrity
115/115, orphan-warnings uendret 262).
Nye KB-filer (ms-ai-security/references/ai-security-engineering/):
- owasp-llm-top10-azure-mitigations.md — konsolidert dekning av de fire
OWASP 2025-kategoriene som manglet referanse i SKILL.md-mappingen
(LLM04 Data/Model Poisoning, LLM06 Excessive Agency, LLM08 Vector/
Embedding Weaknesses, LLM09 Misinformation) med verifiserte Azure-tiltak.
OWASP-side 404 for LLM06/08/09 → definisjoner kryssverifisert, merket.
- defender-threat-protection-ai-services.md — Defender for Cloud «AI threat
protection» (gjeldende navn; plan «Defender for AI Services»). GA for
AI applications, Preview for AI agents (fra 2026-02-02). Varselliste m/
Alert ID + MITRE-taktikk, Prompt Shields-integrasjon, prising (75B-token
trial). KRITISK: ikke tilgjengelig i Azure Government (norsk off. sektor).
SKILL.md (ms-ai-security):
- Fylte de 4 «—»-radene LLM04/06/08/09 → owasp-llm-top10-azure-mitigations.md.
- La til Defender-referanse (kjøretids-trusseldeteksjon) + Government-forbehold.
- Fil-telling ai-security-engineering 17→22 (17 var stale; faktisk 20 + 2 nye).
licensing-matrix.md (ms-ai-advisor):
- Ny rad «Microsoft 365 E7» i master-matrisen + dedikert E7/Agent 365-seksjon.
E7 (GA 2026-05-01) bundler E5 + M365 Copilot + Agent 365 + Entra Suite.
Agent 365 = IT-admin kontrollplan (registry/Entra Agent ID/Defender/Purview).
VERIFISERT at begge er reelle SKU-er. Priser (~$99 E7 / ~$15 Agent 365) er
community-/partnerkilder → eksplisitt merket uverifisert.
disconnected-ai-scenarios.md (ms-ai-infrastructure):
- Ny seksjon «Foundry Local — generativt lokalt og air-gapped». To produkter:
on-device (offline etter nedlasting, ingen Azure-sub) + on Azure Local
(Arc/Kubernetes, Preview). Air-gapped/disconnected støttet fra juni 2026
(Preview): edgeartifacts-registry, expansion packs, lokal AD, ingen
telemetri. Del av Microsoft Sovereign Private Cloud — relevant for norsk
suverenitet.
Tester: validate-plugin 239 PASS / 0 FAIL / 0 WARN · kb-integrity 115/115
(262 pre-eksisterende orphan-warnings, uendret) · run-e2e alle suiter PASS.
#8 nå komplett (S-bannere #8a + M-items #8b). Neste: #9 v1.16.0 release.
FLAGG: `/architect:kb-update` apply forblir UTSATT (krever egen bekreftelse).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
Phase A av #8 currency-rest. Hver faktapåstand verifisert mot kilde FØR
skriving (Microsoft Learn microsoft_docs_fetch + offisielle EU/norske kilder,
2026-06-18). To research-subagenter brukt til parallell faktaverifisering.
Prompt Flow retirement (banner i 5 filer):
- Verifisert verbatim mot Microsoft Learn: Prompt Flow i BÅDE Microsoft Foundry
og Azure Machine Learning pensjoneres 2027-04-20; migrer til Microsoft Agent
Framework (MAF). Container images får ikke lenger oppdateringer.
- Toppbanner: prompt-flow-production-deployment.md, genaiops-llm-specific-practices.md.
- Kontekstuelle inline-flagg: rag-core-patterns.md (bullet + produksjonstabell),
rag-evaluation-frameworks.md (verktøytabell), azure-ai-search-setup.md (PF-seksjon),
agentic-rag-patterns.md (Foundry-integrasjonsrad).
Copilot Studio Computer Use / CUA (copilot-studio.md):
- Preview -> GA 7. mai 2026. KORRIGERT fra intern feildato 2026-05-13 (verifisert
mot Power Platform 2026 wave 1 release plan + What's new).
- Geo presisert: GA i kommersielle miljøer; IKKE GCC/GCC High. Eksakt regionsliste
ikke offentlig verifiserbar -> merket uverifisert (verifiseringsplikt).
- Fjernet nå-utdatert "Velg RPA når: kun GA-features tillatt"-begrunnelse.
Azure AI Search agentic retrieval (agentic-rag-patterns.md):
- Preview -> DELVIS GA. Minimal/ekstraktiv retrieval er GA (REST 2026-04-01);
LLM query planning + answer synthesis er fortsatt preview (2026-05-01-preview).
- "Single index"-begrensning -> multi-source via knowledge bases (kun GA-kildetyper:
searchIndex, azureBlob, indexedOneLake, web; SharePoint/SQL/Fabric/MCP preview).
EU AI Act EØS-status (ai-act-compliance-guide.md):
- Korrigert feilpåstand "direkte gjeldende ... sommeren 2026". AI Act er IKKE
formelt EØS-innlemmet per juni 2026; KI-loven ikke vedtatt av Stortinget
(høringsfrist sept. 2025; ikrafttredelse politisk målsatt sensommer 2026).
EDPB Opinion 28/2024 (gdpr-compliance-ai-systems.md, 3 ankre):
- Nyanserer "anonymisert = utenfor GDPR-scope". Må vurderes case-by-case:
modell er kun anonym når både direkte-ekstraksjon og query-baserte midler gir
ubetydelig re-identifiseringsrisiko (jf. fortalepunkt 26). Tabellrad endret
fra "Nei" til "Betinget".
Allerede gjort i tidligere faser (re-verifisert, ingen edit nødvendig):
MAF-banner (semantic-kernel-agents-implementation.md), Omnibus-note
(ai-act-assessor.md), NSM Grunnprinsipper v2.1, A2A v1.0 + Signed Agent Cards
(egen fil agent-to-agent-a2a-protocol.md). A2A v1.0.1 er immateriell patch.
Tester: validate-plugin 239 PASS / 0 FAIL / 0 WARN · kb-integrity 115/115
(262 orphan-warnings er pre-eksisterende ms-ai-security-backlog, urørt).
Gjenstår i #8: M-items (OWASP LLM04/06/08/09, Defender threat protection,
Foundry Local air-gapped, M365 E7+Agent365) + SKILL.md de-orphan -> deretter #9 release.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
Audit P2 H. DPIA-agenten navngav Schrems II-risikoen (risiko 7) men kunne ikke vurdere den
— ingen sti til TIA-metodikk. Nå nåbar, og ny verifisert metodikk forfattet i KB.
- data-residency-audit-monitoring.md: Schrems II-stubb (3 punkter) utvidet til full EDPB
seks-stegs-TIA (Recommendations 01/2020) + CLOUD Act/FISA 702/EO 12333-restanalyse
+ EO 14086/DPF-nåstatus + tekniske tilleggstiltak (CMK/Customer Lockbox/Confidential
Computing). Korrigerer feilantakelsen «EUDB eliminerer alle overføringer». Last updated 2026-05→06.
- dpia-agent.md: betinget cross-border-ruting + obligatorisk TIA-prosedyre under risiko 7
(operasjonaliserer DPO-svaret «kan amerikanske myndigheter nå disse dataene?»)
- dpia.md: betinget KB i delegeringsprompt; CLAUDE.md: dpia-agent rutingsindeks oppdatert
Verifisert 2026-06-18 (WebSearch, juridiske primærkilder):
- EDPB Recommendations 01/2020 seks-stegs-metodikk + tiltaks-rangering (tekniske sterkest)
- DPF gyldig gjeldende rett; Latombe avvist av Underretten 2025-09-03 (T-553/23),
anket 2025-10-31 → C-703/25 P (ingen berammet dato per mai 2026)
- FISA §702: statutt-utløp 2026-04-20 + 45-dagers extension, reautorisasjon under forhandling
juni 2026; innsamlingsautoritet består via FISA-domstols-sertifiseringer (mars 2026) til mars 2027
- CLOUD Act uendret av DPF; EUDB fjerner ikke tredjelands tilgangsmulighet
validate-plugin: 223 PASS
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
Verifisert 2026-06-18 mot learn.microsoft.com/azure/foundry/agents/overview + classic-deprecation-bannere:
Connected Agents tilhører Foundry (classic), er DEPRECATED og pensjoneres 2027-03-31 — finnes IKKE i nye
Foundry Agent Service. Multi-agent skjer nå via Workflows (2025-11-15-preview) + A2A-tool (preview).
Ny GA-modell = Prompt agents (GA) + Hosted agents (preview), med Responses API som single entry point.
- foundry-agent-service-ga.md: deprecation-banner i header, reframet GA-feature-tabell, markert
Connected Agents-seksjon + beslutningstre/modenhet som classic-bane
- multi-agent-orchestration-patterns.md: 2 Connected Agents-referanser markert classic/deprecated
validate-plugin: 219 PASS
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
Verifisert mot Microsoft Learn region-tabeller 2026-06-18 (alle deployment-pivoter):
KUN gpt-4o/gpt-4o-mini er Norge-resident (Standard/Regional PTU) i Norway East.
gpt-4.1, o3/o4-mini/o3-mini/o1 og HELE GPT-5-familien er IKKE regionale der — kun Global.
Reverserer feilaktig baseline fra del 2/3 (8f9fe8b) som anbefalte gpt-4.1/o3/o4-mini for streng Norge-residens.
- model-catalog-2026.md: ny deployment-type-matrise (seksjon 9), korrigert beslutningstre/
hurtigguide/Norway East-rad (seksjon 10), nye modeller (gpt-5.2-5.5, gpt-5.3-codex/chat,
gpt-chat-latest, gpt-oss-120b/20b, sora-2, gpt-image-2), 1.05M kontekst for 5.4/5.5
- azure-ai-foundry.md: residens-presisering (Norway East-seksjon + spesifikke rad)
- gpt5-gpt41-pricing-models.md: korrigert deployment-valg + TCO-premiss (gpt-4o-mini for residens)
validate-plugin: 219 PASS
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
Audit-hypotesen («GPT-5 data-resident via Regional PTU/Data-Zone der streng
residens kreves») er MOTBEVIST mot live Microsoft Learn (hentet 4 doc-sider,
2026-06-18). GPT-5 har INGEN regional/PTU-deployment i Norway East — kan ikke
gjøres Norge-resident. Hadde planen blitt fulgt blindt, ville en falsk
compliance-påstand blitt skrevet inn i KB. STATEs verifiseringsplikt-advarsel
fanget dette.
Verifisert matrise (GPT-5 × Norway East × deployment-type):
- Standard (regional) / Regional Provisioned (= Norge-residens): INGEN GPT-5-variant
- Data Zone Standard (= EU-residens): kun gpt-5.5; ikke 5/mini/nano/5.1/5.2
- Data Zone Provisioned: norwayeast finnes ikke som region
- Global Standard (global): gpt-5/mini/nano/5.1/5.2 (ikke 5.5)
- Global Provisioned (global): gpt-5/mini/5.1/5.2/5.5
KB-ens nåværende forsiktighet («data kan forlate Norway East») var altså
RIKTIG for de deployment-typene som finnes. De reelle gapene var:
1. Manglende Data Zone-mellomtier (gpt-5.5 = EU-residens)
2. Upresist «kun via Agent Service» (er Global Standard + Global Provisioned)
3. Falsk implisert «GPT-5 + Regional PTU Norway East»-prising
Endringer (3 filer):
- model-catalog-2026.md: regional-tabell (GPT-5-celler), nordisk oppsummering
(fjernet «(regional PTU)»-merkelapp), beslutningstre (tre-tier residens:
Norge/EU-sone/global), hurtigguide (+ EU-residens-rad), Norway East-råd.
- azure-ai-foundry.md: Norway East-modellliste + Norway East-råd (GPT-5-residens).
- gpt5-gpt41-pricing-models.md: fjernet falsk «Norway East Regional ~10-20%»
for gpt-5; modelltilgjengelighet-merknad på offentlig-sektor-tabellen.
For streng Norge-residens forblir svaret gpt-4.1/o3/o4-mini/gpt-4o — IKKE GPT-5.
Kilder: learn.microsoft.com/azure/foundry/foundry-models/concepts/models-sold-directly-by-azure-region-availability
+ .../azure/ai-foundry/openai/how-to/deployment-types
Verifisert: validate-plugin.sh 219 PASS, test-kb-integrity.sh 117/117.
Scope: tilgjengelighetstabell-utvidelse (gpt-5.2/5.5-rader, kolonner) utsatt til del 3/3.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Release-gaten før v1.16.0: bekreftet eksakt engelsk tittel-ordlyd for ASI01–ASI10
mot OWASP GenAI Security Projects offisielle publisering på genai.owasp.org
(9. desember 2025), hentet direkte to ganger uavhengig. Sekundærkilde-spriket som
ros-ai-threat-library.md:541 advarte mot er nå løst mot primærkilden.
Fire titler var feil (KB fulgte aggregator-varianter, ikke offisiell tekst):
- ASI02: «Tool Misuse & Exploitation» → «Tool Misuse»
- ASI03: «Agent Identity & Privilege Abuse» → «Identity & Privilege Abuse»
- ASI04: «Agentic Supply Chain Compromise» → «Agentic Supply Chain Vulnerabilities»
- ASI08: «Cascading Agent Failures» → «Cascading Failures»
Rettet i alle 6 forekomster (hovedtabell + inline OWASP Agentic-mappingrader 579/597).
Kildemerknad (:541) oppdatert: hedge om uverifisert ordlyd erstattet med eksplisitt
primærkilde-referanse + hvilke sekundærvarianter som florerer.
Notasjon (:2026): uendret. Offisiell blogg bruker ASIxx uten årstall, men KB bruker
konsekvent :ÅRSTALL for OWASP-IDer (jf. LLM05:2025) — intern konsistens beholdt,
flagget separat for normaliserings-beslutning.
Verifisert: validate-plugin.sh 219 PASS.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Komplett dekning- + ferskhetsgjennomgang for norske Azure AI/Foundry-arkitekter. Kilder verifisert mot Microsoft Learn + web 2026-06-18.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REiKFhP4w6xGXXqWKpPCJJ
Pre-trekexecute snapshot of in-progress CLAUDE.md/SKILL.md edits and
extracted docs/ files. Captured as one commit so /trekexecute claude-design
can run against a clean working tree.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Standardize named-markdown-link guidance across all plugins so file://
references render as independently clickable links in terminals like
Ghostty (bare file:// URLs only make the first clickable).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- renderCost: FIX — KEY_STATS_CONFIG['cost-distribution'] og inferVerdict('cost-distribution') viste "[object Object]" / returnerte alltid 'go' fordi parser-output har p50/p90 = {monthly, yearly}-objekter, ikke tall. Begge ekstraherer nå .monthly med fallback for flate fixtures.
- renderLicense: PASS — ingen kode-endring. Capability-matrix-status korrekt utledet (met/partial/missing) via parseCapabilityMatrix. Visuell QA gjenstår i sesjon 6.
- renderCompare: FIX — firstWord-heuristikk feilet når begge subjekter delte førsteord (f.eks. "Azure AI Foundry" vs "Azure ML + AKS" ga begge fw='azure', kollapset vinn-attribusjon). Erstattet med distinctive-token-matching: full-subject-substring først, deretter ord som er unike for ett subjekt. Diff-cell coloring oppdatert til samme matchSubject()-helper.
- renderUtredning: MINOR — droppet misvisende role="tab"/role="tablist" siden vi rendrer anchor-jump-TOC (alle paneler synlige), ikke ekte tab-toggle. Beholdt aria-current="true" for visuell aktiv-markør (DS-CSS hekter på den). Ekte tab-toggle defer til v1.15.0.
validate-plugin.sh: 219 PASS uendret
run-e2e.sh --playground: 272 PASS uendret
test-playground-migrations.sh: 7 PASS uendret
Refs V1.14.0-AUDIT.local.md sub-batch E (sesjon 5b).
- renderMigrate: <section class="phase-detail"> per fase erstattet med
<div class="expansion">-list (DS-supplement). Default-collapsed, klikkbar
header (Fase N: navn + duration), body = milepaeler + suksesskriterier.
Behold cycle-ribbon + mat-ladder + phases-summary-tabell + risks-tabell.
- renderPoc: speil renderMigrate. Traffic-light flyttet inn i expansion-body
(ul.traffic-list per fase med status fra fasens stepState).
- renderSummary: KEY_STATS_CONFIG['verdict'] patchet — parseTable returnerer
rader med header-baserte nokler (Metric/Verdi/Mal) ikke canonical
{label,value,unit}. Ny logikk bruker metrics_headers + heuristikk-match for
label/value/unit-kolonner, med fallback til canonical felt.
Backward-kompatibelt.
- renderAdr: verifisert PASS — ingen endring (.adr-meta + critique-cards
rendrer pent uten ekstra arbeid).
- ACTIONS['phase-expand']: ny handler registrert som alias for
requirement-expand (samme toggle-monster, eget action-navn for senere
divergens).
- Lokal CSS: hele .phase-detail-blokken (~10 linjer) slettet. Defensive-
kommentar oppsummert til 5-linjers historie-notat.
- Style-blokk effektive linjer: 147 (var 178 etter sesjon 4).
Smoke-tester:
- validate-plugin.sh: 219 PASS
- run-e2e.sh --playground: 272 PASS (202 statisk + 70 parser)
- test-playground-migrations.sh: 7 PASS
Refs V1.14.0-AUDIT.local.md sub-batch D.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bugfixes (B-DS-1, B-DS-2, B-DS-3 fra V1.14.0-AUDIT):
- .kanban-card__name (tier3-supplement): word-break: break-all → break-word
+ overflow-wrap: anywhere. Knekket midt i ord ("Tekn isk dokumen tasjon").
- .expansion__title-main, .expansion__title-sub (tier3-supplement): legg
til display: block. Begge er <span> som flyter inline by default —
resultat: "dokumentertKilde: Art. 9" på samme linje.
- .matrix__bubble (components.css): legg til cursor: pointer, hover-scale
og focus-visible. Antas rendret som <button> i konsumenter — gir
visuell + keyboard-fokus-feedback.
Re-syncet til plugins/ms-ai-architect/playground/vendor/ via
sync-design-system.mjs. Slettet 3 lokal-overrides i playground HTML
(matrix-bubble, expansion-title, kanban-card-name). Style-blokk:
191 → 182 linjer.
Smoke-tester: validate-plugin 219 PASS, e2e --playground 272 PASS,
statisk struktur 202 PASS.
Andre plugins (llm-security, voyage, okr, config-audit) påvirkes IKKE
— beholder gammel vendored DS inntil de selv re-syncer.
Sesjon 2 av 6 i v1.14.0 root-cause-multi-sesjons-løp.
ms-ai-architect plugin-versjon ikke bumpet (sesjon 6 ship-er v1.14.0).
[skip-docs]: docs oppdateres i sesjon 6 ved v1.14.0 plugin-ship.
Refs V1.14.0-AUDIT.local.md sub-batch 1 + 4.
10 visuelle bugs identifisert av maintainer i nettleser etter v1.13.0
shipped. Patch-pakke som adresserer mismatch mellom playground-rendrere
og DS-konvensjoner som v1.13.0 ikke fanget opp.
- B7: classify "Forpliktelser" indent — lokal .report-meta CSS-reset
(DL grid max-content+1fr, h4 uppercase+bold, ul padding-left space-5)
for konsistent venstre-justering uavhengig av nestelse.
- B8a: requirement-expand handler missing — renderRequirements markup
hadde data-action="requirement-expand" på hver expansion__head, men
ingen ACTIONS-handler var registrert. R-01..R-09-radene i AI Act-krav
var derfor ikke klikkbare. Fix: register ACTIONS['requirement-expand'].
- B8b: expansion title-main + title-sub kjørte sammen — DS' spans var
inline. Lokal display:block så de stables vertikalt.
- B10: kanban-card tegnknekking — DS' word-break:break-all knekker midt
i ord. Lokal override med break-word.
- B11: DPIA matrix-bobler ikke responderer — v1.13.0 click-handler
matchet kun mot første-kolonne i Trusler-tabellen. DPIA-fixturer har
full-tekst label i matrix_cells men T-001-id i threats-tabellen, så
ingen match. Utvid til (Pass 1) exact first-cell + (Pass 2) substring-
match mot enhver celle med 40-tegn-prefiks-toleranse.
- B12, B13, B15: defensive layout for top-risks/suppressed-panel/
phase-detail/aiact-timeline — eksplisitt display:block; clear:both;
width:100% mot grid-leak fra small-multiples/kanban-board/mat-ladder.
- B14: Migrate "skal vel være tabell" — phases-summary-tabell over
phase-detail-seksjonene (Fase, Varighet, Milepæler-count, Suksesskriterier-
count, Status). Samme tabell speilet i renderPoc for konsistens.
Verifisering:
- 23/23 smoke-test PASS (B7-B15 + 5 v1.13.0-regresjoner)
- 271/271 playground E2E PASS
- 219 plugin-validering PASS
- 42 KB-update PASS
Versjon: v1.13.0 -> v1.13.1 (plugin.json, README badge, README
version-history, CHANGELOG, ROADMAP, TODO, plugin CLAUDE.md
playground-header, root README plugin-list, root CLAUDE.md plugin-list).
Berører kun lokal CSS i <style>-blokk, ACTIONS-handler-registrering,
click-handler-utvidelse, og to renderer-funksjoner. Ingen modifisering
av playground/vendor/. Vendored DS' .kanban-card__name { word-break:
break-all } står — overstyres lokalt.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fix-pakke som speiler llm-security v7.6.1 (commit f9b555a). Samme klasse
visuelle bugs identifisert via parallell DS-analyse av playground-rendrere.
- B1: renderFindingsBlock + renderRequirements bytter <div class="findings">
outer (DS grid 360px+1fr klemte indre struktur til 360px-kolonne, lot
1fr-detail-panel-kolonnen stå tom) til <section class="report-meta">.
BEM-strukturen findings__list > findings__group > findings__items uendret.
- B2: lokal .report-table CSS for 6+ rapporter (Trusler, Kostnadsoversikt,
TCO, Risiko-tabell, Key Metrics) som manglet styling — DS implementerer
ikke klassen. Speilet lokal styling fra llm-security v7.6.1.
- B3: ROS-matrise-bobler bytter <span> til <button type="button"
data-threat-id="..." aria-label="..."> med document-level click-handler
som scroller smooth til tilsvarende rad i Trusler-tabellen og
highlighter raden i 1.6 sek. Lokal CSS for cursor:pointer, hover
scale(1.15), :focus-visible outline.
- B4: renderRadarSvg bumpet 300x300 til 380x380, R fra 100 til 125,
label-offset fra R+25 til R+28, dynamisk text-anchor basert på
horisontal-posisjon for å unngå at bottom-labels overlapper hverandre
ved 6+ akser (typisk for ROS-rapport med 7 risiko-dimensjoner).
- B5: lokal .recommendation-card__body { overflow-wrap: anywhere;
word-break: break-word } for å forhindre at lange single-line tekster
(URLer, owner-tags, dato) skubber innhold ut av viewport i grid-cellen.
tests/test-playground-v3.sh: DS-klasse-assertion oppdatert fra .findings
til .findings__list (BEM-list er fortsatt i bruk; outer grid-container
bevisst fjernet i B1).
Verifisering:
- 22/22 smoke-test PASS (B1-B5 grep-asserts)
- 271/271 playground E2E PASS (201 statisk-struktur + 70 parser-fixtures)
- 219 plugin-validering PASS
- 42 KB-update test PASS
Versjon: v1.12.0 -> v1.13.0 (plugin.json, README badge, README
version-history, CHANGELOG, ROADMAP, TODO, plugin CLAUDE.md
playground-header, root README plugin-list, root CLAUDE.md plugin-list).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Synthetic ROS-analyse output for "Acme Kunde-chatbot" (Acme Kommune)
following the same pattern as security-assessment, cost-estimation,
ai-act and summary fixtures. Satisfies all 29 assertions in
tests/test-ros-output.sh:
- 8 phases (Fase 1-8) plus Ledelsessammendrag
- 12 trusler i T-XXX-NN format (MAESTRO + OWASP-mapping)
- 9 risikoer i R-N format
- 10 tiltak i M-N format
- 7 ROS-dimensjoner med X/5-scoring
- 5x5 risikomatrise + restrisiko-tabell
- NS 5814 + ISO 31000 metodikk-referanser
- AI Act, GDPR, OWASP regulatoriske referanser
- MAESTRO + supply-chain referanser (Vedlegg O coverage)
Tar bort den siste pre-eksisterende run-e2e-feilen
(`bash tests/run-e2e.sh` exits 0).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ToS-vurdering konkluderte med at autonom cron-kjøring er unødvendig kompleks
for en solo-fork-and-own-plugin. Apply-fasen krever LLM-resonnering uansett,
så manuell trigger fra en aktiv Claude Code-sesjon er enklere og holder
pluginen klart innenfor Anthropic Consumer Terms paragraf 3 (automated access
only via API key or where explicitly permitted — Claude Code CLI er
eksemptert som offisielt verktøy).
Lagt til:
- commands/kb-update.md — ny /architect:kb-update slash-kommando som driver
poll, endringsrapport, microsoft_docs_fetch-update og commit fra sesjonen.
Argumenter: --skip-discover, --priorities, --dry-run, --single-commit
- Catalog-entry i playground HTML for kb-update (categori: tool, 4 input-felt)
Slettet (Wave 3-5 reversert, ~1500 linjer + 7 testmoduler):
- scripts/install-kb-cron.mjs (cross-OS scheduler-installer)
- scripts/kb-update/weekly-kb-cron.mjs (cron-orkestrator med pre-flight, lock,
backup, claude -p subprocess, post-run verify, rollback)
- scripts/kb-update/templates/ (4 scheduler-templates: launchd plist, systemd
service+timer, Windows ps1 + README)
- scripts/kb-update/lib/auth-mode.mjs (cron-spesifikk auth validation)
- scripts/kb-update/lib/lock-file.mjs (PID+mtime stale-detection)
- scripts/kb-update/lib/cost-estimat.mjs (pre-flight budget-cap)
- 7 testmoduler under tests/kb-update/ for slettet kode
- tests/test-kb-update.sh (Bash-3.2-shim, erstattet av direkte node --test)
Beholdt (utility-laget fortsatt brukbart):
- run-weekly-update.mjs, report-changes.mjs, build-registry.mjs,
discover-new-urls.mjs (KB change-detection-pipelinen)
- lib/atomic-write, lib/backup, lib/cross-platform-paths, lib/log-rotate
- 4 testmoduler (42/42 tester PASS)
Endret:
- hooks/scripts/session-start-context.mjs: fjern kb-update-status.json-overvaaking
- tests/run-e2e.sh --kb-update kaller node --test direkte i stedet for shim
- README.md, CLAUDE.md: KB-vedlikehold-seksjon rewriter for manuell modell
- plugin.json: 1.11.0 -> 1.12.0
- Rot README + CLAUDE.md: ms-ai-architect-versjon bumpet
Schedulering er bevisst utenfor scope og overlatt til brukeren — eventuelle
forks som vil ha periodisk varsling kan sette opp egen cron / launchd /
GitHub Actions som kjører rapport-fasen og varsler om aa kjore
/architect:kb-update i CC-sesjon.
Verifisering:
- bash tests/validate-plugin.sh: 219 PASS, 0 FAIL
- bash tests/run-e2e.sh --kb-update: 42/42 inner + suite PASS
- bash tests/run-e2e.sh --playground: 271/271 PASS (statisk + parsers)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Step 12 — adds --kb-update flag to tests/run-e2e.sh and a Bash 3.2-compatible
shim test-kb-update.sh that runs `node --test tests/kb-update/*.test.mjs`
(shell-glob form; Node 25 rejects directory-form arguments). Shim translates
node --test exit code + parsed pass/fail counts into the e2e-helpers.sh
suite counters (init_suite/print_summary).
Verification:
- Playground baseline 271 PASS unchanged before/after edit
- bash tests/run-e2e.sh --kb-update: exits 0, 110/110 inner tests pass
- bash tests/run-e2e.sh --all: kb-update suite included
- Pre-existing ROS-fixture absence (tests/fixtures/ros-analysis/) is
unrelated to this change and remains for separate handling
Wave 5 of 7 in v1.12.0 auto-KB-update plan.
Plan: .claude/projects/2026-05-04-kb-update-fork-and-own/plan.md (Step 12)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Step 11 of v1.12.0 plan (.claude/projects/2026-05-04-kb-update-fork-and-own/plan.md).
scripts/install-kb-cron.mjs lives at the scripts/ root (not inside
scripts/kb-update/) because it is a plugin-wide install tool, not part of
the KB-update pipeline itself. Reads the appropriate template from
scripts/kb-update/templates/, fills {{NODE_BIN}}, {{PLUGIN_ROOT}},
{{LOG_FILE}}, {{SCHEDULE_HOUR/MINUTE/DAY_OF_WEEK}} placeholders, writes
to the platform-specific scheduler dir, and registers the job:
macOS - launchctl bootstrap gui/<uid> <plist> (load -w fallback)
Linux - systemctl --user daemon-reload && enable --now <timer>
Windows - powershell -ExecutionPolicy Bypass -File <ps1> (beta)
Flags: --print-only, --target macos|linux|windows, --uninstall, --purge,
--node-bin, --claude-bin, --schedule "M H * * D" (default: Wed 04:23).
UID resolution for launchctl is guarded by process.getuid() POSIX-only
(undefined on Windows). MCP server presence in ~/.claude.json is
warning-only per brief Spørsmål 7. WSL detected via /proc/version.
Cross-OS rendering supported via --print-only --target <other>; install
on a non-host target rejects with explicit error.
11 subprocess + filesystem-snapshot tests in
tests/kb-update/test-install-cron.test.mjs verify --print-only produces
filled templates with no unsubstituted {{...}} placeholders, --print-only
writes nothing under HOME, --uninstall is idempotent on an empty HOME,
--schedule substitutes correctly, and invalid flags reject with non-zero
exit. Tests never invoke launchctl/systemctl/Register-ScheduledTask
against real schedulers.
Tests: 110/110 pass (was 99 before this step).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Foundation lib for v1.12.0 cron rewrite — closes brief deliverable
"log-rotate" that was missing from the original plan (Phase 9 scope
revision). Standard logrotate idiom, zero dependencies.
- rotateLog(logPath, opts) returns {rotated, dropped, kept}
- Defaults: maxSizeBytes 10 MB, maxGenerations 5 (1 active + 4 rotated)
- No-op when log missing or under threshold
- Over-size: drop oldest, shift .N..1 down by one, move active → .1
- maxGenerations=1 keeps only the active slot (no rotated copies)
- Pure stdlib fs.renameSync chain with silent try/catch on missing gens
8/8 tests pass: missing/under-size/over-size paths, chained 6 rotations
capped at maxGenerations, oldest dropped, two-step content shift.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Foundation lib for v1.12.0 cron rewrite. Detects which Claude auth mode is
in scope and rejects modes that are architecturally incompatible with cron.
Resolution order:
- ANTHROPIC_API_KEY env-var → 'api-key'
- CLAUDE_CODE_OAUTH_TOKEN env-var → 'long-oauth'
- ~/.claude.json onboarded + runner exit 0 → 'subscription-browser-only'
- otherwise → 'unauthenticated'
Subscription browser-OAuth tokens expire ~15h and cannot survive cron — the
detector flags them explicitly so validateAuthForCron throws EAUTHCRON with
a remediation message pointing to `claude setup-token` or ANTHROPIC_API_KEY.
Both runner (subprocess invoker) and claudeJsonPath (~/.claude.json) are
dependency-injected. Tests stub them — no real subprocess spawn, no home-
directory reads.
15/15 tests pass: precedence, env-var detection, onboarded subscription,
non-onboarded fallback, validateAuthForCron throw paths.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Foundation lib for v1.12.0 cron rewrite skill-tree backup/restore.
Zero dependencies. Uses fs.cpSync (recursive + preserveTimestamps) without
dereference (Node 22.17.x regression) and without filter (Windows symlink-
type bug).
- backupDir(srcDir, backupRoot, opts) → {backupPath, retentionDays, restore()}
- Backup-id format YYYY-MM-DDTHH-MM-SS (filesystem-safe; no colons)
- .backup-meta.json sentinel written as first action inside backupPath
- restore() writes .rollback-in-progress at backupRoot BEFORE rmSync+cpSync
so a crashed restore leaves the sentinel for the next run to detect
- detectStaleRollback(backupRoot) — boolean predicate over sentinel
- cleanupOldBackups(backupRoot, retentionDays) — 3-step age resolution:
meta.created_at → dir mtime → skip-with-warning (never delete a dir
whose age cannot be established)
12/12 tests pass: timestamp format, content round-trip, sentinel lifecycle,
retention, mtime fallback, unparseable-meta skip, missing-root no-op.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Foundation lib for v1.12.0 cron rewrite. Atomic exclusive create via
fs.writeFileSync('wx'); on EEXIST resolves staleness with OR semantics:
stale if PID is dead OR mtime exceeds threshold. Either alone breaks the
lock — handles SIGKILL orphans (mtime), PID-reuse races (mtime), and
crashed-then-replaced runs (PID).
- acquireLock(lockPath, opts) → {lockPath, release()}
- staleThresholdMs default 1h; refreshIntervalMs opt-in for long runs
- registerCleanup default true (exit/SIGINT/SIGTERM/SIGHUP/uncaughtException)
- isPidAlive uses kill(pid, 0) with EPERM-as-alive nuance
12/12 tests pass: PID liveness, fixture concurrency, idempotent release,
stale variants (dead+old, live+old, fresh+live), staleThresholdMs honored.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Pure auth-mode-aware cost estimator for v1.12.0 cron pre-flight.
Heuristic: critical+high files only (medium/low excluded per brief);
3000 input + 1500 output tokens per file at Sonnet pricing
($3/M in, $15/M out).
Auth-mode behavior:
- api-key: numeric usd, kvote_warn off (subject to dollar-cap)
- long-oauth, subscription-browser-only:
usd null, kvote_warn on (quota, no dollar billing)
- unauthenticated/missing: best-effort api-key estimate
11/11 tests pass; covers both billing modes plus token-math
invariance across auth-mode (auth only affects dollar-field, not tokens).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Foundation lib for status-fil + lock-fil writes in v1.12.0 cron rewrite.
Pattern: writeFileSync to <path>.tmp.<pid>.<random> then renameSync to
target. Defends against half-written files; readers either see the
previous version or the new one, never a partial.
- atomicWriteSync(path, content) — string or Buffer
- atomicWriteJson(path, obj) — 2-space indent, trailing newline
- Windows EEXIST/EPERM defensive fallback (unlink target + rename)
- Best-effort tmp cleanup on writeFileSync failure
- crypto.randomInt(0, 2**32) two-arg form (unambiguous across Node)
9/9 tests pass including 50-way concurrent-write fuzzer (async-aware
withTmp helper).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>