diff --git a/README.md b/README.md index dea374f..d93fed0 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,6 @@ Key commands: `/architect`, `/architect:ros`, `/architect:security`, `/architect - **17 inline report renderers** routed via canonical archetype-routing table: classify pyramid, ROS/security 5×5 + 6×5 risk matrices, radar, findings tables, cost distribution, capability matrix, phased plans, decision-record envelopes - **Light/dark theme toggle** persisted in `localStorage('ms-ai-architect-theme')`, FOUC-safe via ``-bootstrap script - **Validation:** 240 PASS combined (`bash tests/run-e2e.sh --playground` runs static-structure + parser-fixture suites) -- **Screenshots in plugin README:** 6 reproducible PNGs of the 4 surfaces and 3 report archetypes (classify pyramid, ROS 5×5 matrix + radar, cost P10/P50/P90). Regenerate with `python3 plugins/ms-ai-architect/scripts/screenshots/capture-playground.py` (Playwright + chromium). - **Vendored design-system** at `playground/vendor/`, kept in sync via `scripts/sync-design-system.mjs ms-ai-architect`. Standalone — opens from `file://` without server or marketplace dependency. → [Full documentation](plugins/ms-ai-architect/README.md) diff --git a/plugins/ms-ai-architect/CHANGELOG.md b/plugins/ms-ai-architect/CHANGELOG.md index b65fe26..5e2288d 100644 --- a/plugins/ms-ai-architect/CHANGELOG.md +++ b/plugins/ms-ai-architect/CHANGELOG.md @@ -33,7 +33,7 @@ The playground at `playground/ms-ai-architect-playground.html` was rebuilt from - `tests/test-playground-v3.sh` — bash 3.2-compatible static structure tests (170 PASS lines): vendored CSS link order, file://-safety, surfaces, 24 commands, 14 parsers, 17 renderers, design-system class usage, exposed globals, 23 ACTIONS handlers. - `tests/test-playground-parsers.sh` — 70 PASS lines: validates 17 fixtures × parser routing keys + handlePasteImport wiring. - `tests/run-e2e.sh --playground` — new flag dispatching both suites; included in `--all`. -- `playground/test-fixtures/` — 17 synthetic markdown fixtures (one per report-producing command, ANPR traffic-analysis example) covering all canonical parser archetypes. +- `playground/test-fixtures/` — 17 synthetic markdown fixtures (one per report-producing command) covering all canonical parser archetypes. Generic example data only. - `playground/A11Y-RAPPORT.md` — accessibility report skeleton with WCAG 2.2 AA test grid for both themes. - `playground/MANUAL-CHECKLIST.md` — 10-section manual QA checklist (round-trip, schema migration, project CRUD, command form prefill, paste-import per report type, parse errors, export/import cycle, theme toggle, file://-standalone, axe-core a11y per surface) with concrete DevTools-console assertions. diff --git a/plugins/ms-ai-architect/CLAUDE.md b/plugins/ms-ai-architect/CLAUDE.md index 5979a12..79bd83c 100644 --- a/plugins/ms-ai-architect/CLAUDE.md +++ b/plugins/ms-ai-architect/CLAUDE.md @@ -193,12 +193,6 @@ Interaktiv decision-builder + rapport-viewer for Microsoft AI-beslutninger. Erst | Manuell A11Y QA | Se `playground/MANUAL-CHECKLIST.md` | 10 seksjoner inkl. axe-core-kjøring per surface | | A11Y-rapport | `playground/A11Y-RAPPORT.md` | Skjelett — fylles ut etter kjøring | -### Screenshot-suite (v1.9.0) - -`scripts/screenshots/capture-playground.py` automatiserer screenshots av alle 4 surfaces + 3 rapport-arketyper via Playwright. Output går til `playground/screenshots/` og embeddes i plugin README. Krever Playwright Python-pakke + chromium. Kjøres med `python3 scripts/screenshots/capture-playground.py` — ca. 15-20 sekunder. Demo-state seedes inline (Statens vegvesen ANPR-eksempel matcher fixture-filene), så ingen interaktivt brukerflow er nødvendig. - -Kjør på nytt etter design-endringer i playground eller `shared/playground-design-system/` (etter sync). - ### Vendored design-system Playground laster CSS fra `playground/vendor/playground-design-system/` — en vendored diff --git a/plugins/ms-ai-architect/README.md b/plugins/ms-ai-architect/README.md index 2af825b..80c29d9 100644 --- a/plugins/ms-ai-architect/README.md +++ b/plugins/ms-ai-architect/README.md @@ -364,19 +364,6 @@ Interactive **decision-builder + report viewer** for Microsoft AI architecture d open plugins/ms-ai-architect/playground/ms-ai-architect-playground.html ``` -### Screenshots - -| Surface | Preview | What you see | -|---------|---------|--------------| -| Onboarding (18 shared fields, 5 grouped expansions) | ![Onboarding](playground/screenshots/01-onboarding.png) | Sidebar with form-progress per group · all 5 groups collapsed when complete · "Lagre og fortsett" enabled when 18/18 filled | -| Home (project list + 3 entry tracks) | ![Home](playground/screenshots/02-home.png) | Greeting based on shared state · 3 entry-track cards · project cards with completion meter (0/17 reports) · sticky topbar with theme toggle | -| Catalog (24 commands across 5 expansion categories, full-text search) | ![Catalog](playground/screenshots/03-catalog.png) | Search input · 24 of 24 hits · expansion groups (Regulatorisk/Sikkerhet/Økonomi/Dokumentasjon/Verktøy) · expanded card with `RAPPORT` pill, description, argument hints, and "Åpne skjema" | -| Project — EU AI Act classify report (pyramid renderer) | ![Classify pyramid](playground/screenshots/04-project-classify-pyramide.png) | 4-tier risk pyramid with active tier (`aria-current="true"`) · role + justification · obligations bullet list per Art. 9-49 | -| Project — ROS analysis (5×5 matrix + 7-dimension radar) | ![ROS matrix](playground/screenshots/05-project-ros-matrix.png) | 5×5 risk matrix · color-banded cells with threat-bubbles per consequence × likelihood · radar overlay covering 7 ROS-AI dimensions (Etterlevelse/Konfidensialitet/Integritet/Sporbarhet/Pålitelighet/Robusthet) | -| Project — Cost report (P10/P50/P90 distribution) | ![Cost distribution](playground/screenshots/06-project-cost-distribution.png) | P10/P50/P90 bars · per-component NOK breakdown table · 3-year capex/opex/total/akkumulert ledger | - -Reproduce: `python3 scripts/screenshots/capture-playground.py` (Playwright + chromium required). - ### Validation | Test | Command | Coverage | diff --git a/plugins/ms-ai-architect/playground/screenshots/01-onboarding.png b/plugins/ms-ai-architect/playground/screenshots/01-onboarding.png deleted file mode 100644 index 0afd9fb..0000000 Binary files a/plugins/ms-ai-architect/playground/screenshots/01-onboarding.png and /dev/null differ diff --git a/plugins/ms-ai-architect/playground/screenshots/02-home.png b/plugins/ms-ai-architect/playground/screenshots/02-home.png deleted file mode 100644 index a4c8884..0000000 Binary files a/plugins/ms-ai-architect/playground/screenshots/02-home.png and /dev/null differ diff --git a/plugins/ms-ai-architect/playground/screenshots/03-catalog.png b/plugins/ms-ai-architect/playground/screenshots/03-catalog.png deleted file mode 100644 index e52916c..0000000 Binary files a/plugins/ms-ai-architect/playground/screenshots/03-catalog.png and /dev/null differ diff --git a/plugins/ms-ai-architect/playground/screenshots/04-project-classify-pyramide.png b/plugins/ms-ai-architect/playground/screenshots/04-project-classify-pyramide.png deleted file mode 100644 index 88a1e1d..0000000 Binary files a/plugins/ms-ai-architect/playground/screenshots/04-project-classify-pyramide.png and /dev/null differ diff --git a/plugins/ms-ai-architect/playground/screenshots/05-project-ros-matrix.png b/plugins/ms-ai-architect/playground/screenshots/05-project-ros-matrix.png deleted file mode 100644 index 08e91dd..0000000 Binary files a/plugins/ms-ai-architect/playground/screenshots/05-project-ros-matrix.png and /dev/null differ diff --git a/plugins/ms-ai-architect/playground/screenshots/06-project-cost-distribution.png b/plugins/ms-ai-architect/playground/screenshots/06-project-cost-distribution.png deleted file mode 100644 index ba5876e..0000000 Binary files a/plugins/ms-ai-architect/playground/screenshots/06-project-cost-distribution.png and /dev/null differ diff --git a/plugins/ms-ai-architect/playground/test-fixtures/adr.md b/plugins/ms-ai-architect/playground/test-fixtures/adr.md index 633ae3c..74f3c99 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/adr.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/adr.md @@ -1,14 +1,14 @@ -# ADR-001 — Velg Azure AI Foundry som primær AI-plattform for ANPR-trafikkanalyse +# ADR-001 — Velg Azure AI Foundry som primær AI-plattform for Demosystem Status: accepted Date: 2026-04-30 Deciders: AI-arkitekt, sikkerhetsarkitekt, seksjonsleder -Consulted: personvernombud, juridisk rådgiver, Drift -Informed: prosjekteierskap, KI-seksjonen +Consulted: Datatilsynet, juridisk rådgiver, Drift +Informed: prosjekteierskap, AI-teamet ## Context and Problem Statement -Statens vegvesen skal modernisere ANPR-trafikkanalyse fra on-prem OCR-løsning til skybasert AI-plattform. Plattformen må støtte custom modell-trening, audit-logging på inferens-nivå, real-time inferens (<100ms P95), og full compliance med EU AI Act + GDPR + sikkerhetsloven. +Acme AS skal modernisere Demosystem fra on-prem OCR-løsning til skybasert AI-plattform. Plattformen må støtte custom modell-trening, audit-logging på inferens-nivå, real-time inferens (<100ms P95), og full compliance med EU AI Act + GDPR + sikkerhetsloven. ## Decision Drivers @@ -17,7 +17,7 @@ Statens vegvesen skal modernisere ANPR-trafikkanalyse fra on-prem OCR-løsning t - Customer-managed keys og Private Endpoints - Custom modell-trening kapabilitet - Total cost of ownership over 3 år -- Driftbarhet for KI-seksjonen +- Driftbarhet for AI-teamet ## Considered Options @@ -32,7 +32,7 @@ Chosen option: **Azure AI Foundry**, fordi det balanserer compliance, driftbarhe ### Consequences -- Good: full compliance-pakke for offentlig sektor, raskere time-to-prod, integrert med eksisterende Entra ID +- Good: full compliance-pakke for leverandøren, raskere time-to-prod, integrert med eksisterende Entra ID - Good: customer-managed keys og Customer Lockbox tilgjengelig - Bad: lock-in til Azure, men mitigert via standardiserte modell-formater (ONNX) og data-portabilitet - Bad: høyere månedlig kostnad enn ren Azure ML — kompenseres ved redusert egen-drift diff --git a/plugins/ms-ai-architect/playground/test-fixtures/classify.md b/plugins/ms-ai-architect/playground/test-fixtures/classify.md index db41099..30d4d25 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/classify.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/classify.md @@ -1,7 +1,7 @@ -# EU AI Act — Klassifisering: ANPR-trafikkanalyse +# EU AI Act — Klassifisering: Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) -Beskrivelse: AI-system som identifiserer kjøretøy som har overtrådt fartsgrense via kameradata + kjøretøyregister +System: Demosystem (Acme AS) +Beskrivelse: AI-system som identifiserer objekter som krever oppfølging via sensordata + objektregister ## Risikonivå @@ -13,7 +13,7 @@ Rolle: Provider og Deployer (utvikler internt + drifter selv) ## Begrunnelse -Reasoning: Systemet brukes av offentlig myndighet for håndheving av lov, og påvirker individers rettigheter direkte gjennom automatisert beslutningsstøtte for sanksjonering. Dette plasserer systemet under Annex III, punkt 6 (rettshåndhevelse) og krever full høyrisiko-compliance per Art. 6(2). +Reasoning: Systemet brukes av offentlig myndighet for håndheving av lov, og påvirker individers rettigheter direkte gjennom automatisert beslutningsstøtte for håndtering. Dette plasserer systemet under Annex III, punkt 6 (rettshåndhevelse) og krever full høyrisiko-compliance per Art. 6(2). ## Forpliktelser diff --git a/plugins/ms-ai-architect/playground/test-fixtures/compare.md b/plugins/ms-ai-architect/playground/test-fixtures/compare.md index c550d24..bb15e59 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/compare.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/compare.md @@ -1,6 +1,6 @@ # Sammenligning — Azure AI Foundry vs Azure ML + AKS -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Sammenligningsdato: 2026-04-30 ## Subjects @@ -14,8 +14,8 @@ Subject 2: Azure ML + AKS |--------|------------------|----------------|--------| | Time-to-prod | 6-8 uker for fundament | 12-16 uker | Foundry | | Custom modell-trening | Integrert via Azure ML under panseret | Direkte Azure ML | Lik | -| Compliance-pakke for offentlig sektor | Inkludert | Må bygges selv | Foundry | -| Driftbarhet for KI-seksjonen | Lav driftbyrde, mest klikk-ops | Høy driftbyrde, full DevOps | Foundry | +| Compliance-pakke for leverandøren | Inkludert | Må bygges selv | Foundry | +| Driftbarhet for AI-teamet | Lav driftbyrde, mest klikk-ops | Høy driftbyrde, full DevOps | Foundry | | Fleksibilitet for custom infrastruktur | Begrenset til Foundry-mønstre | Full kontroll over AKS-cluster | Azure ML + AKS | | Audit-logging på inferens | Innebygd | Må konfigureres manuelt | Foundry | | Customer-managed keys | Tilgjengelig | Tilgjengelig | Lik | @@ -29,12 +29,12 @@ Subject 2: Azure ML + AKS ## Sammendrag -Azure AI Foundry vinner på time-to-prod, compliance-pakke, og driftbarhet. Azure ML + AKS vinner på pris (-12%) og fleksibilitet. Differansen i pris (~NOK 800k over 3 år) er liten sammenlignet med besparelsen i drift-tid for KI-seksjonen. +Azure AI Foundry vinner på time-to-prod, compliance-pakke, og driftbarhet. Azure ML + AKS vinner på pris (-12%) og fleksibilitet. Differansen i pris (~NOK 800k over 3 år) er liten sammenlignet med besparelsen i drift-tid for AI-teamet. ## Anbefaling -For Statens vegvesen med begrenset KI-driftkapasitet anbefales Azure AI Foundry. For organisasjoner med dedikert MLOps-team kan Azure ML + AKS gi marginalt bedre kost-nytte. +For Acme AS med begrenset KI-driftkapasitet anbefales Azure AI Foundry. For organisasjoner med dedikert MLOps-team kan Azure ML + AKS gi marginalt bedre kost-nytte. ## Kontekst -Beslutningen er sterkere drevet av compliance og driftbarhet enn ren kostnad. Foundry's offentlig sektor-pakke sparer 8-12 uker arbeid med å sertifisere baseline-konfigurasjonen. +Beslutningen er sterkere drevet av compliance og driftbarhet enn ren kostnad. Foundry's leverandøren-pakke sparer 8-12 uker arbeid med å sertifisere baseline-konfigurasjonen. diff --git a/plugins/ms-ai-architect/playground/test-fixtures/conformity.md b/plugins/ms-ai-architect/playground/test-fixtures/conformity.md index 39da0f3..4d2f35f 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/conformity.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/conformity.md @@ -1,6 +1,6 @@ -# Samsvarsvurdering (Art. 43) — ANPR-trafikkanalyse +# Samsvarsvurdering (Art. 43) — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Vurderingsprosedyre: Annex VI (intern kontroll) ## Sjekkliste @@ -12,8 +12,8 @@ Vurderingsprosedyre: Annex VI (intern kontroll) | Teknisk dokumentasjon Annex IV komplett | partial | Mangler ytelsesmål per stratum | | Logging av hendelser implementert | met | OpenTelemetry-spans i Azure Monitor | | Transparens-instruksjoner skrevet | missing | Skal leveres innen 2026-09-01 | -| Menneskelig oversikt på saksbehandlere | met | Workflow-design godkjent av juridisk | -| Nøyaktighetsmål dokumentert | partial | 96.3% overall, men ikke per kjennemerke-region | +| Menneskelig oversikt på saksbehandler | met | Workflow-design godkjent av juridisk | +| Nøyaktighetsmål dokumentert | partial | 96.3% overall, men ikke per objekt-ID-region | | Robusthet under adversarielle forhold | partial | Test-suite mangler skitne plater og natt-scenarier | | Cybersikkerhetstiltak per Art. 15 | met | NSM Grunnprinsipper-vurdering bestått | | Conformity assessment underskrevet | missing | Avhengig av FRIA-resultat | diff --git a/plugins/ms-ai-architect/playground/test-fixtures/cost.md b/plugins/ms-ai-architect/playground/test-fixtures/cost.md index 63508df..6e10d86 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/cost.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/cost.md @@ -1,6 +1,6 @@ -# Kostnadsestimat — ANPR-trafikkanalyse +# Kostnadsestimat — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Periode: 12 måneder fra produksjonssetting Valuta: NOK @@ -18,7 +18,7 @@ Valuta: NOK |-----------|-------------------| | Azure AI Services (OCR + classification) | 64 000 | | Azure OpenAI (forklaringsmodell) | 28 000 | -| Azure AI Search (indeks for kjøretøyregister) | 12 000 | +| Azure AI Search (indeks for objektregister) | 12 000 | | Storage (blob + cosmos for audit) | 8 500 | | Compute (Container Apps for orchestration) | 11 000 | | Networking (Private Endpoints + egress) | 5 200 | @@ -35,7 +35,7 @@ Valuta: NOK ## Kostnadsdrivere -- Trafikkvolum: ~12 millioner ANPR-deteksjoner/mnd +- Datavolum: ~12 millioner Demosystem-deteksjoner/mnd - Forklaring-prompt-tokens: ~250 tokens per flagged hendelse - Reservert kapasitet for 99.9% SLA diff --git a/plugins/ms-ai-architect/playground/test-fixtures/dpia.md b/plugins/ms-ai-architect/playground/test-fixtures/dpia.md index 47577e1..dac56e4 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/dpia.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/dpia.md @@ -1,17 +1,17 @@ -# DPIA / PVK — ANPR-trafikkanalyse +# DPIA / PVK — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Metodikk: Datatilsynets veileder + ISO/IEC 29134 ## Risikomatrise (5×5) | Trussel | Sannsynlighet | Konsekvens | Score | Nivå | |---------|---------------|------------|-------|------| -| Feilaktig kjennemerke-tolkning fører til urettmessig sanksjon | 3 | 4 | 12 | medium | -| Massiv lokasjonsdata-lekkasje fra kjøretøyregister | 2 | 5 | 10 | medium | +| Feilaktig objekt-ID-tolkning fører til urettmessig sanksjon | 3 | 4 | 12 | medium | +| Massiv lokasjonsdata-lekkasje fra objektregister | 2 | 5 | 10 | medium | | AI-forklaring viser sensitiv kontekst om eier | 3 | 3 | 9 | medium | -| Stratifisert bias mot utenlandske kjennemerker | 4 | 3 | 12 | medium | -| Fysisk angrep på kameraer skaper deteksjonshull | 2 | 2 | 4 | low | +| Stratifisert bias mot utenlandske objekt-ID | 4 | 3 | 12 | medium | +| Fysisk angrep på sensordata skaper deteksjonshull | 2 | 2 | 4 | low | | Insider-misbruk for sporing av enkeltpersoner | 2 | 5 | 10 | medium | | Auto-flagging utløser kjedereaksjon ved system-feil | 1 | 5 | 5 | low | | Subject Access Request (GDPR Art. 15) ignoreres | 3 | 3 | 9 | medium | @@ -20,7 +20,7 @@ Metodikk: Datatilsynets veileder + ISO/IEC 29134 | ID | Beskrivelse | Severity | Tiltak | |----|-------------|----------|--------| -| T-001 | Feilaktig OCR av kjennemerker | high | Konfidensgrad-cutoff på 0.95; saksbehandler-review under cutoff | +| T-001 | Feilaktig OCR av objekt-ID | high | Konfidensgrad-cutoff på 0.95; saksbehandler-review under cutoff | | T-002 | Lokasjonsdata-lekkasje | critical | Pseudonymisering ved lagring; HSM-backed nøkler i Azure Key Vault | | T-003 | Kontekst-eksponering i AI-forklaring | high | Filter på sensitive felt; kontekst kun til autorisert saksbehandler | | T-004 | Bias mot utenlandske registre | high | Kvartalsvis stratifisert testing; juster modell ved >5% avvik | @@ -38,4 +38,4 @@ Metodikk: Datatilsynets veileder + ISO/IEC 29134 ## Konklusjon -Restrisiko etter tiltak: medium-lav. DPIA godkjent av personvernombud 2026-04-22. +Restrisiko etter tiltak: medium-lav. DPIA godkjent av Datatilsynet 2026-04-22. diff --git a/plugins/ms-ai-architect/playground/test-fixtures/frimpact.md b/plugins/ms-ai-architect/playground/test-fixtures/frimpact.md index d9310d4..5865754 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/frimpact.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/frimpact.md @@ -1,6 +1,6 @@ -# FRIA (Fundamental Rights Impact Assessment) — ANPR-trafikkanalyse +# FRIA (Fundamental Rights Impact Assessment) — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Hjemmel: EU AI Act Art. 27 (obligatorisk for offentlig sektor) ## Vurderte rettigheter @@ -9,9 +9,9 @@ Hjemmel: EU AI Act Art. 27 (obligatorisk for offentlig sektor) |-----------|--------|--------| | Menneskeverd | 1 | Ingen reduksjon — saksbehandler tar endelig avgjørelse, ikke AI | | Rett til frihet og sikkerhet | 1 | Ingen frihetsberøvelse direkte fra AI; politi/domstol er reell beslutter | -| Respekt for privatliv | 4 | Massiv overvåking via veikameraer — kompenseres med strenge oppbevaringsregler (90 dager), formålsbegrensning, og minimering av kobling til kjøretøyregister | -| Personvern | 4 | DPIA gjennomført; Datatilsynet konsultert; rettslig grunnlag i vegtrafikkloven §13 — likevel høy impact pga skala | -| Ikke-diskriminering | 3 | Algoritmisk bias-testing på kjennemerker fra utenlandske registre (lavere ANPR-nøyaktighet) — kvartalsvis review | +| Respekt for privatliv | 4 | Massiv overvåking via veikameraer — kompenseres med strenge oppbevaringsregler (90 dager), formålsbegrensning, og minimering av kobling til objektregister | +| Personvern | 4 | DPIA gjennomført; Datatilsynet konsultert; rettslig grunnlag i interne retningslinjer §13 — likevel høy impact pga skala | +| Ikke-diskriminering | 3 | Algoritmisk bias-testing på objekt-ID fra utenlandske registre (lavere Demosystem-nøyaktighet) — kvartalsvis review | | Ytringsfrihet og informasjonsfrihet | 0 | Ikke berørt | | Forsamlingsfrihet | 0 | Ikke berørt | | Religionsfrihet | 0 | Ikke berørt | diff --git a/plugins/ms-ai-architect/playground/test-fixtures/license.md b/plugins/ms-ai-architect/playground/test-fixtures/license.md index 18f155f..29dc87e 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/license.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/license.md @@ -1,20 +1,20 @@ -# Lisens-kapabilitetsmatrise — ANPR-trafikkanalyse +# Lisens-kapabilitetsmatrise — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Vurderingsdato: 2026-04-30 ## Matrise | Kapabilitet | M365 E3 | M365 E5 | Copilot for M365 | Copilot Studio | Azure AI Foundry | |-------------|---------|---------|------------------|----------------|------------------| -| OCR av kjennemerker | missing | missing | missing | conditional | available | +| OCR av objekt-ID | missing | missing | missing | conditional | available | | Custom modell-trening | missing | missing | missing | missing | available | | Audit-logging på AI-input | missing | available | available | available | available | | Customer-managed keys | missing | available | conditional | conditional | available | | Private Endpoints | missing | available | missing | conditional | available | -| Saksbehandler-co-pilot UI | missing | missing | available | available | conditional | +| saksbehandler-co-pilot UI | missing | missing | available | available | conditional | | Norsk språkstøtte i prompts | available | available | available | available | available | -| Compliance-pakke for offentlig sektor | missing | available | conditional | conditional | available | +| Compliance-pakke for leverandøren | missing | available | conditional | conditional | available | | Real-time inference (<100ms) | missing | missing | missing | missing | available | | Batch-inference for nattlige jobber | missing | missing | missing | missing | available | diff --git a/plugins/ms-ai-architect/playground/test-fixtures/migrate.md b/plugins/ms-ai-architect/playground/test-fixtures/migrate.md index eaa39e3..a45ad1b 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/migrate.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/migrate.md @@ -1,6 +1,6 @@ -# Migrasjonsplan — ANPR-trafikkanalyse +# Migrasjonsplan — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Fra: On-prem OCR + manuell klassifisering Til: Azure AI Foundry + saksbehandler-co-pilot @@ -26,29 +26,29 @@ Suksesskriterier: Varighet: 8 uker Milepæler: -- Treningsdata kuratert (200k norske kjennemerker, stratifisert) +- Treningsdata kuratert (200k norske objekt-ID, stratifisert) - Custom modell trent på Azure ML - Baseline-nøyaktighet etablert (mål: ≥96% F1) - Bias-evaluering på utenlandske registre fullført Suksesskriterier: -- F1 ≥ 96% overall, ≥ 92% per kjøretøy-segment +- F1 ≥ 96% overall, ≥ 92% per objekter-segment - Drift-deteksjon kalibrert med terskel - ROS-revisjon godkjent -### Fase 3 — Saksbehandler-co-pilot (uker 15-22) +### Fase 3 — saksbehandler-co-pilot (uker 15-22) Varighet: 8 uker Milepæler: - Forklaringsmodell (GPT-4 Turbo) integrert via Foundry -- Saksbehandler-UI bygget (Copilot Studio + Power Platform) +- saksbehandler-UI bygget (Copilot Studio + Power Platform) - Workflow: AI flagger → saksbehandler reviewer → klar for sanksjon -- Brukertest med 12 saksbehandlere fra ulike regioner +- Brukertest med 12 saksbehandler fra ulike regioner Suksesskriterier: - Saksbehandlingstid -40% vs baseline -- Saksbehandler-tillit >7/10 i post-pilot survey +- saksbehandler-tillit >7/10 i post-pilot survey - Ingen kritiske UX-feil ### Fase 4 — Compliance og produksjonssetting (uker 23-28) @@ -71,7 +71,7 @@ Suksesskriterier: | Risiko | Sannsynlighet | Konsekvens | Tiltak | |--------|---------------|------------|--------| | Custom modell underyter mot 96% mål | medium | high | Backup-strategi: bruk Azure AI Vision OCR som fallback | -| Saksbehandler-motstand mot AI | medium | medium | Tidlig involvering; transparent forklaring; opt-out på enkelt-saker | +| saksbehandler-motstand mot AI | medium | medium | Tidlig involvering; transparent forklaring; opt-out på enkelt-saker | | FRIA blokkerer fase 4 | low | high | Pre-FRIA-kjøring i fase 2 for tidlig varsling | | Cost-overrun ved skalering | medium | medium | Reserved capacity-binding etter fase 3 | diff --git a/plugins/ms-ai-architect/playground/test-fixtures/poc.md b/plugins/ms-ai-architect/playground/test-fixtures/poc.md index 43b1c54..7479ec7 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/poc.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/poc.md @@ -1,6 +1,6 @@ -# POC-plan — ANPR-trafikkanalyse +# POC-plan — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) POC-mål: Validere at Azure AI Foundry kan dekke OCR + forklaring + audit innen tids- og kostbudsjett ## Faser @@ -12,7 +12,7 @@ Varighet: 2 uker Milepæler: - Foundry hub + project i West Europe - Identity og networking konfigurert -- Sample-data uploadet (10k anonymiserte kjennemerker) +- Sample-data uploadet (10k anonymiserte objekt-ID) Suksesskriterier: - Inferens-endpoint nåbart fra dev-Vnet via Private Endpoint @@ -25,7 +25,7 @@ Varighet: 3 uker Milepæler: - Pre-trent Azure AI Vision OCR pilotert -- Custom fine-tune på 10k kjennemerker +- Custom fine-tune på 10k objekt-ID - Sammenligning av accuracy/latency mellom de to Suksesskriterier: @@ -40,11 +40,11 @@ Varighet: 2 uker Milepæler: - GPT-4 Turbo via Foundry integrert - Prompt-template for forklaring av flagged sak -- Saksbehandler-mock UI (en enkel webside) prøvd ut med 3 brukere +- saksbehandler-mock UI (en enkel webside) prøvd ut med 3 brukere Suksesskriterier: - Forklaring referer til konfidens og kontekst korrekt i 95% av tilfellene -- Saksbehandler-feedback kvalitativt positiv ("forståelig, men trenger justering") +- saksbehandler-feedback kvalitativt positiv ("forståelig, men trenger justering") - Prompt-tokens under 250 i snitt per sak ### Fase 4 — Compliance-pre-check (uke 8) @@ -54,7 +54,7 @@ Varighet: 1 uke Milepæler: - Audit-logg mot EU AI Act Art. 12-krav - Customer-managed keys verifisert -- Pre-DPIA-sjekk gjort med personvernombud +- Pre-DPIA-sjekk gjort med Datatilsynet Suksesskriterier: - Audit-logg dekker 100% av inferences med tidsstempel + bruker @@ -67,7 +67,7 @@ Suksesskriterier: |--------|---------------|------------|--------| | Custom OCR-modell underyter pre-trent | medium | medium | Aksepter pre-trent for POC; planlegg custom for full prod | | Foundry-quota i West Europe utilstrekkelig | low | medium | Reserver kapasitet før POC starter | -| Saksbehandler-recruitment forsinker fase 3 | medium | low | Bruk interne ressurser i KI-seksjonen som mock | +| saksbehandler-recruitment forsinker fase 3 | medium | low | Bruk interne ressurser i AI-teamet som mock | | Audit-logg-format ikke kompatibelt med Sentinel | low | medium | Test integrasjon i fase 1 | ## Total varighet diff --git a/plugins/ms-ai-architect/playground/test-fixtures/requirements.md b/plugins/ms-ai-architect/playground/test-fixtures/requirements.md index e491b47..46eece0 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/requirements.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/requirements.md @@ -1,6 +1,6 @@ # EU AI Act — Krav for høyrisiko provider+deployer -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Klassifisering: høy risiko, rolle Provider+Deployer ## Krav diff --git a/plugins/ms-ai-architect/playground/test-fixtures/review.md b/plugins/ms-ai-architect/playground/test-fixtures/review.md index ac803ce..fbe96f4 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/review.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/review.md @@ -1,22 +1,22 @@ -# Arkitekturgjennomgang — ANPR-trafikkanalyse +# Arkitekturgjennomgang — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Vurderingsdato: 2026-04-30 -Reviewers: AI-arkitekt, sikkerhetsarkitekt, personvernombud +Reviewers: AI-arkitekt, sikkerhetsarkitekt, Datatilsynet ## Funn | ID | Severity | Lokasjon | Anbefaling | |----|----------|----------|------------| -| F-01 | critical | Authentication layer | Tilgang til AI-forklaringer mangler attribute-based access control — alle saksbehandlere ser alle saker. Implementer ABAC basert på sak-tildeling. | +| F-01 | critical | Authentication layer | Tilgang til AI-forklaringer mangler attribute-based access control — alle saksbehandler ser alle saker. Implementer ABAC basert på sak-tildeling. | | F-02 | high | Data pipeline | Treningsdata oppdateres månedlig, men ingen formell drift-deteksjon. Etabler statistisk drift-monitoring i Azure Monitor. | | F-03 | high | Model serving | Modellen serves fra en enkelt regional endpoint uten failover. Replikér til en sekundær region for RTO < 1t. | | F-04 | high | Logging | Audit-logg lagres 30 dager — under arkivlovens krav for sak-relevant info. Endre retensjon til 7 år for sak-knyttede oppslag. | -| F-05 | medium | Cost management | Ingen budsjettalarmer på Azure AI Services — prediction-kostnaden kan øke med 4× ved trafikk-topp uten varsel. | +| F-05 | medium | Cost management | Ingen budsjettalarmer på Azure AI Services — prediction-kostnaden kan øke med 4× ved belastnings-topper uten varsel. | | F-06 | medium | Compliance | FRIA-rapport ikke vedlikeholdt etter modell-endring 2026-03-12. Re-evaluering trengs. | -| F-07 | medium | UX | Saksbehandler-grensesnitt viser ikke konfidensgrad tydelig nok — risiko for over-trust på AI-output. | +| F-07 | medium | UX | saksbehandler-grensesnitt viser ikke konfidensgrad tydelig nok — risiko for over-trust på AI-output. | | F-08 | low | Documentation | README mangler oppdatert arkitekturdiagram (siste fra 2025-11). | -| F-09 | low | Testing | Manglende E2E-test for utenlandske kjennemerker. | +| F-09 | low | Testing | Manglende E2E-test for utenlandske objekt-ID. | ## Sammendrag diff --git a/plugins/ms-ai-architect/playground/test-fixtures/ros.md b/plugins/ms-ai-architect/playground/test-fixtures/ros.md index 961f19a..9882f1e 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/ros.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/ros.md @@ -1,6 +1,6 @@ -# ROS-analyse — ANPR-trafikkanalyse +# ROS-analyse — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Metodikk: NS 5814 / ISO 31000 + AI-trusselbibliotek ## Risikomatrise (5×5) @@ -14,7 +14,7 @@ Metodikk: NS 5814 / ISO 31000 + AI-trusselbibliotek | Klage-saksbehandling overbelastet ved skalering | 4 | 3 | 12 | medium | | Datatap pga manglende georedundans | 1 | 5 | 5 | low | | Misbruk av AI-forklaring som bevis | 3 | 4 | 12 | medium | -| Kjedevirkning ved feil i kjøretøyregister | 2 | 5 | 10 | medium | +| Kjedevirkning ved feil i objektregister | 2 | 5 | 10 | medium | ## Radar-akser (7 dimensjoner) diff --git a/plugins/ms-ai-architect/playground/test-fixtures/security.md b/plugins/ms-ai-architect/playground/test-fixtures/security.md index d77e522..08285ef 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/security.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/security.md @@ -1,6 +1,6 @@ -# Sikkerhetsvurdering 6×5 — ANPR-trafikkanalyse +# Sikkerhetsvurdering 6×5 — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Rammeverk: NSM Grunnprinsipper + Microsoft Cloud Security + EU AI Act Art. 15 ## Score per dimensjon @@ -30,7 +30,7 @@ Rammeverk: NSM Grunnprinsipper + Microsoft Cloud Security + EU AI Act Art. 15 | ID | Severity | Lokasjon | Anbefaling | |----|----------|----------|------------| | S-01 | high | Identity | Aktivér PIM på alle serviceprinciper innen 2026-06-01 | -| S-02 | medium | Data | Aktivér Customer Lockbox for trafikkdata | +| S-02 | medium | Data | Aktivér Customer Lockbox for operasjonelle data | | S-03 | high | Model | Gjennomfør formell red-team-runde med Azure AI Red Team-veiledning | | S-04 | low | Network | Periodisk verifikasjon av Private Endpoint-konfigurasjon | | S-05 | medium | Logging | Implementer ML-basert avviksdeteksjon på AI-output-rate | diff --git a/plugins/ms-ai-architect/playground/test-fixtures/summary.md b/plugins/ms-ai-architect/playground/test-fixtures/summary.md index b6742e7..1025a47 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/summary.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/summary.md @@ -1,9 +1,9 @@ -# Beslutningsnotat — ANPR-trafikkanalyse +# Beslutningsnotat — Demosystem -System: ANPR-trafikkanalyse (Statens vegvesen) +System: Demosystem (Acme AS) Dato: 2026-04-30 Til: Direktør for Digital og IT -Fra: KI-seksjonen +Fra: AI-teamet ## Verdict @@ -34,7 +34,7 @@ Arkitekturen er teknisk solid og økonomisk forsvarlig (P50 NOK 1.7M/år), men c ## Restrisiko -Etter foreslåtte tiltak: medium. Hovedeksponering: bias mot utenlandske kjennemerker krever løpende monitoring. +Etter foreslåtte tiltak: medium. Hovedeksponering: bias mot utenlandske objekt-ID krever løpende monitoring. ## Anbefaling diff --git a/plugins/ms-ai-architect/playground/test-fixtures/transparency.md b/plugins/ms-ai-architect/playground/test-fixtures/transparency.md index f36e4d4..d4dfc40 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/transparency.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/transparency.md @@ -1,14 +1,14 @@ -# Transparensnotis — ANPR-trafikkanalyse +# Transparensnotis — Demosystem -Tittel: Informasjon om automatisert trafikkanalyse (Art. 13 og Art. 50) +Tittel: Informasjon om automatisert operasjonell analyse (Art. 13 og Art. 50) ## Hva systemet gjør -Statens vegvesen bruker et AI-system som leser av kjennemerker (ANPR — Automatic Number Plate Recognition) fra kameraer langs riksveg og kommunal veg. Systemet identifiserer kjøretøy som har overtrådt fartsgrensen gjennom å beregne gjennomsnittsfart mellom to kameraposisjoner. +Acme AS bruker et AI-system som leser av objekt-ID (Demosystem — automatisert klassifisering) fra sensordata langs produksjonsmiljøet. Systemet identifiserer objekter som har overtrådt terskelverdi gjennom å beregne gjennomsnittlig respons mellom to datapunkt. ## Hvilke data som behandles -Behandlede data inkluderer kjennemerke, tidsstempel, kameraposisjon, kjøretøytype og oppslag i Statens vegvesens kjøretøyregister. Personlig identifiserbar informasjon kobles ikke til oppføring uten saksbehandlers eksplisitte godkjenning. +Behandlede data inkluderer objekt-ID, tidsstempel, datapunkt, objektklasse og oppslag i Acme AS objektregister. Personlig identifiserbar informasjon kobles ikke til oppføring uten saksbehandler eksplisitte godkjenning. ## Hvordan beslutninger tas @@ -20,6 +20,6 @@ Som registrert har du rett til innsyn (GDPR Art. 15), retting (Art. 16), slettin ## Kontakt -Personvernombud: pvo@vegvesen.no +Personvernombud: pvo@Acme.no Tilsyn: Datatilsynet — postkasse@datatilsynet.no EU AI Act-tilsyn: under etablering (Digitaliseringsdirektoratet er forventet) diff --git a/plugins/ms-ai-architect/playground/test-fixtures/utredning.md b/plugins/ms-ai-architect/playground/test-fixtures/utredning.md index 3793fed..3dad013 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/utredning.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/utredning.md @@ -1,8 +1,8 @@ -# AI-arkitekturutredning — ANPR-trafikkanalyse for Statens vegvesen +# AI-arkitekturutredning — Demosystem for Acme AS ## 1. Bakgrunn og formål -Statens vegvesen har siden 2018 driftet en on-prem ANPR-løsning for trafikkanalyse på riksveger og enkelte kommunale veger. Løsningen er basert på OCR-bibliotek fra 2017 og leveres som et lukket system uten mulighet for retrening eller forbedring av modell. Saksbehandlingen er manuell og tar i snitt 14 minutter per sak. KI-seksjonen utreder modernisering til en skybasert AI-plattform som støtter custom modell-trening, audit-logging på inferens-nivå, og saksbehandler-co-pilot. +Acme AS har siden 2018 driftet en on-prem Demosystem-løsning for operasjonell analyse på tvers av leverandørens tjenesteportefølje. Løsningen er basert på et OCR-bibliotek fra 2017 og leveres som et lukket system uten mulighet for retrening eller forbedring av modell. Saksbehandlingen er manuell og tar i snitt 14 minutter per sak. Et internt AI-team utreder modernisering til en skybasert AI-plattform som støtter custom modell-trening, audit-logging på inferens-nivå, og saksbehandler-co-pilot. ## 2. Mandat @@ -17,7 +17,7 @@ Utredningen skal: Utredningen kombinerer: - Kvalitativ analyse av compliance-krav per relevante lover og forskrifter -- Kvantitativ TCO-analyse basert på 12 millioner ANPR-deteksjoner/mnd +- Kvantitativ TCO-analyse basert på 12 millioner Demosystem-deteksjoner/mnd - Risikoanalyse per NS 5814 og DPIA per Datatilsynets veileder - Markedsundersøkelse av tilgjengelige plattformer fra Azure, AWS og GCP @@ -25,12 +25,12 @@ Utredningen kombinerer: ### 4.1 Compliance -EU AI Act klassifiserer systemet som høyrisiko (Annex III, punkt 6 — rettshåndhevelse). Statens vegvesen er Provider og Deployer, hvilket trigger alle krav i Art. 9-15 + Art. 27 (FRIA) + Art. 49 (registrering). +EU AI Act klassifiserer systemet som høyrisiko (Annex III, punkt 6 — rettshåndhevelse). Acme AS er Provider og Deployer, hvilket trigger alle krav i Art. 9-15 + Art. 27 (FRIA) + Art. 49 (registrering). ### 4.2 Teknologivalg Azure AI Foundry er anbefalt primær plattform fordi: -- Full compliance-pakke for offentlig sektor +- Full compliance-pakke for leverandøren - Customer-managed keys og Customer Lockbox tilgjengelig - Custom modell-trening via integrert Azure ML - Norsk dataresidens (West Europe + EU Data Boundary) @@ -41,7 +41,7 @@ Azure AI Foundry er anbefalt primær plattform fordi: ### 4.4 Risiko -Hovedrisiko: bias mot utenlandske kjennemerker, modell-drift over tid, og manglende ABAC-implementering på saksbehandler-tilgang. Alle har konkrete tiltak. +Hovedrisiko: bias mot utenlandske objekt-ID, modell-drift over tid, og manglende ABAC-implementering på saksbehandler-tilgang. Alle har konkrete tiltak. ## 5. Konklusjon diff --git a/plugins/ms-ai-architect/scripts/screenshots/capture-playground.py b/plugins/ms-ai-architect/scripts/screenshots/capture-playground.py deleted file mode 100644 index 2895526..0000000 --- a/plugins/ms-ai-architect/scripts/screenshots/capture-playground.py +++ /dev/null @@ -1,360 +0,0 @@ -#!/usr/bin/env python3 -""" -capture-playground.py — Tar screenshots av Playground v3 i alle 4 surfaces × 2 themes. - -Bruker Playwright Python (sync API). Åpner playground/ms-ai-architect-playground.html -direkte fra disk via file:// URL og populerer state programmatisk via window.__store -før hvert screenshot. Dette gir reproduserbare screenshots uten å klikke gjennom hele -brukerflyten manuelt. - -Output: playground/screenshots/*.png - -Kjøring: - python3 scripts/screenshots/capture-playground.py - -Krav: Playwright + chromium installert. På macOS: - pip3 install playwright - playwright install chromium -""" - -import json -import sys -from pathlib import Path -from playwright.sync_api import sync_playwright, Page - -PLUGIN_ROOT = Path(__file__).resolve().parent.parent.parent -HTML_PATH = PLUGIN_ROOT / "playground" / "ms-ai-architect-playground.html" -FIXTURES_DIR = PLUGIN_ROOT / "playground" / "test-fixtures" -SCREENSHOTS_DIR = PLUGIN_ROOT / "playground" / "screenshots" - -VIEWPORT = {"width": 1440, "height": 900} -TALL_VIEWPORT = {"width": 1440, "height": 1200} # for surfaces med mer innhold - -# Demo-data — Statens vegvesen ANPR-eksempelet (matcher fixtures). -DEMO_SHARED = { - "organization": { - "name": "Statens vegvesen", - "description": "Trafikketat ansvarlig for vegnett, kjøretøy og sjåføropplæring", - "sector": "Statlig", - "size": "2000-10000", - "regulatory_requirements": [ - "Personopplysningsloven/GDPR", - "Sikkerhetsloven", - "Forvaltningsloven", - "Offentleglova", - ], - }, - "technology": { - "cloud_platform": ["Azure", "M365"], - "license_type": "E5", - "ai_services_in_use": ["Azure OpenAI", "Copilot for M365", "Azure AI Search"], - }, - "security": { - "data_classification": ["Intern", "Fortrolig"], - "data_residency": "Norge", - "dpia_practice": "Systematisk", - "certifications": "ISO 27001, ISO/IEC 42001 (under etablering)", - }, - "architecture": { - "preferred_platform": "Azure AI Foundry", - "integration_needs": ["M365", "SharePoint", "Fagsystemer", "REST API-er"], - "annual_ai_budget": "2M-10M", - }, - "business": { - "governance_model": "Sentralisert", - "doc_format_preferences": ["Markdown", "SharePoint Wiki"], - "reference_architecture": "TOGAF + intern AI-styringsmodell", - }, -} - -DEMO_PROJECTS = [ - { - "id": "proj-anpr-2026", - "name": "ANPR Trafikkanalyse", - "description": "Automatisk skiltgjenkjenning for trafikkflyt-analyse på E18.", - "createdAt": "2026-04-15T09:00:00Z", - "local": { - "system_name": "ANPR Trafikkanalyse", - "system_description": "Sanntids skiltgjenkjenning av kjøretøy på utvalgte strekninger på E18 for trafikkflyt-analyse.", - "interaction_type": "automatisering", - "users": "Vegtrafikkavdelingen + analytikere", - "risk_level_assumption": "Høy", - "risk_classification": "Høy", - "org_role": "Provider", - "data_sources": "Kameraer langs E18, kjøretøyregisteret (begrenset), værdata fra met.no", - }, - "reports": {}, - }, - { - "id": "proj-saksbehandler-2026", - "name": "Saksbehandlerassistent", - "description": "Copilot-basert assistent for førerkortssøknader og kjøretøy-registrering.", - "createdAt": "2026-04-22T10:30:00Z", - "local": { - "system_name": "Saksbehandlerassistent v1", - "system_description": "M365 Copilot Studio-agent som hjelper saksbehandlere med førerkort-søknader, henter relevant lovverk og foreslår sakssvar.", - "interaction_type": "beslutningsstøtte", - "users": "Saksbehandlere ved 22 trafikkstasjoner", - "risk_level_assumption": "Begrenset", - "risk_classification": "Begrenset", - "org_role": "Deployer", - }, - "reports": {}, - }, - { - "id": "proj-chatbot-2026", - "name": "Brukerstøtte chatbot", - "description": "Publikumsrettet chatbot på vegvesen.no for førerkort- og kjøretøyspørsmål.", - "createdAt": "2026-05-01T13:15:00Z", - "local": {}, - "reports": {}, - }, -] - - -def read_fixture(name: str) -> str: - """Les en av de 17 ANPR-fixture-filene.""" - return (FIXTURES_DIR / f"{name}.md").read_text(encoding="utf-8") - - -def seed_state(page: Page, *, projects=True): - """Populerer __store.state med demo-data og trigger render.""" - payload = { - "shared": DEMO_SHARED, - "projects": DEMO_PROJECTS if projects else [], - } - page.evaluate( - """({shared, projects}) => { - for (const k of Object.keys(shared)) { - const target = window.__store.state.shared[k]; - for (const f of Object.keys(shared[k])) target[f] = shared[k][f]; - } - if (projects.length > 0) { - window.__store.state.projects.length = 0; - for (const p of projects) window.__store.state.projects.push(p); - } - window.__scheduleRender(); - }""", - payload, - ) - page.wait_for_timeout(200) - - -def import_reports(page: Page, project_id: str, command_ids: list): - """Kaller __handlePasteImport på et aktivt prosjekt etter at project-surface - er rendret. Må kalles ETTER navigate('project') siden handlePasteImport - rendrer direkte til DOM-slottet og scheduleRender ville slette det.""" - page.evaluate( - """({pid}) => { window.__store.state.activeProjectId = pid; }""", - {"pid": project_id}, - ) - for cmd in command_ids: - markdown = read_fixture(cmd) - page.evaluate( - """({cmd, md}) => { window.__handlePasteImport(cmd, md); }""", - {"cmd": cmd, "md": markdown}, - ) - page.wait_for_timeout(150) - - -def navigate(page: Page, surface: str, project_id: str = None, project_tab: str = None): - """Bytter aktiv surface (og evt. aktivt prosjekt + tab) og trigger render.""" - page.evaluate( - """({surface, pid}) => { - if (pid) window.__store.state.activeProjectId = pid; - window.__navigate(surface); - }""", - {"surface": surface, "pid": project_id}, - ) - page.wait_for_timeout(250) - # Project-tab er module-local (currentProjectTab) — må klikkes via faktisk knapp - if surface == "project" and project_tab: - page.evaluate( - """(tab) => { - const btn = document.querySelector('[data-action=\"project-tab\"][data-tab=\"' + tab + '\"]'); - if (btn) btn.click(); - }""", - project_tab, - ) - page.wait_for_timeout(200) - - -def set_theme(page: Page, theme: str): - """Setter tema (light/dark) før screenshot.""" - page.evaluate( - """(theme) => { - document.documentElement.setAttribute('data-theme', theme); - try { localStorage.setItem('ms-ai-architect-theme', theme); } catch(e){} - // Re-render topbar slik at theme-toggle-label oppdateres - const labels = document.querySelectorAll('[data-theme-label]'); - for (const l of labels) l.textContent = theme === 'dark' ? 'Mørk' : 'Lys'; - }""", - theme, - ) - page.wait_for_timeout(100) - - -def shoot(page: Page, name: str, *, full_page: bool = False, scroll_to: str = None): - """Lagrer en screenshot. Default: viewport-only. - - full_page=True: hele scroll-høyden - scroll_to: CSS-selektor som scrolles inn i view før shot - """ - out = SCREENSHOTS_DIR / f"{name}.png" - if scroll_to: - page.evaluate( - """(sel) => { - const el = document.querySelector(sel); - if (el) el.scrollIntoView({block: 'start', behavior: 'instant'}); - window.scrollBy(0, -20); - }""", - scroll_to, - ) - page.wait_for_timeout(120) - page.screenshot(path=str(out), full_page=full_page) - print(f" [{name}.png] {out.relative_to(PLUGIN_ROOT)}") - - -def open_clean(browser, viewport=None): - """Åpner playground med ren state og venter på bootstrap.""" - context = browser.new_context(viewport=viewport or VIEWPORT) - page = context.new_page() - # Hopp til about:blank først for å rense localStorage/IDB fra forrige - # kontekst-kjøring (file:// kan dele storage på samme browser-instans). - page.goto("about:blank") - page.evaluate( - """async () => { - try { localStorage.clear(); } catch(e){} - try { sessionStorage.clear(); } catch(e){} - if (typeof indexedDB !== 'undefined' && indexedDB.databases) { - try { - const dbs = await indexedDB.databases(); - await Promise.all(dbs.map(d => new Promise(r => { - const req = indexedDB.deleteDatabase(d.name); req.onsuccess = req.onerror = req.onblocked = r; - }))); - } catch(e){} - } - }""" - ) - page.goto(f"file://{HTML_PATH}") - # Vent til __store er eksponert (bootstrap fullført) - page.wait_for_function("() => window.__store && window.__CATALOG", timeout=10_000) - # Skjul evt. error-banner som kan dukke opp fra bootstrap-kanter - page.evaluate( - """() => { - const errs = document.querySelectorAll('[data-onboarding-errors]'); - for (const e of errs) e.setAttribute('hidden', ''); - }""" - ) - return context, page - - -def main(): - if not HTML_PATH.exists(): - print(f"FEIL: {HTML_PATH} mangler", file=sys.stderr) - sys.exit(1) - - SCREENSHOTS_DIR.mkdir(parents=True, exist_ok=True) - print(f"Lagrer screenshots til: {SCREENSHOTS_DIR.relative_to(PLUGIN_ROOT)}") - print() - - with sync_playwright() as pw: - browser = pw.chromium.launch(headless=True) - - # NB: light-mode tokens er ikke implementert i det vendrede - # design-systemet ennå (kun mørk-tema-vars). Theme-toggle bytter - # data-theme + label korrekt, men CSS-fargene endres ikke før - # tokens.css får [data-theme="light"]-overrides. Vi capture'r kun - # mørk-modus for nå. Når light-tokens kommer, endre listen til - # ("dark", "light") for å regenerere parsuffix-screenshots. - for theme in ("dark",): - suffix = "" if theme == "dark" else "-light" - print(f"--- Theme: {theme} ---") - - # 1. Onboarding (utfylt) — TALL viewport for å vise sidebar + alle 5 grupper - ctx, page = open_clean(browser, viewport=TALL_VIEWPORT) - seed_state(page, projects=False) - navigate(page, "onboarding") - set_theme(page, theme) - page.evaluate( - """() => { - const errs = document.querySelectorAll('[data-onboarding-errors]'); - for (const e of errs) e.setAttribute('hidden', ''); - }""" - ) - page.wait_for_timeout(150) - shoot(page, f"01-onboarding{suffix}") - ctx.close() - - # 2. Home (med 3 prosjekter) - ctx, page = open_clean(browser) - seed_state(page) - navigate(page, "home") - set_theme(page, theme) - page.wait_for_timeout(150) - shoot(page, f"02-home{suffix}") - ctx.close() - - # 3. Catalog (alle grupper synlig) — utvid de første 2 gruppene - ctx, page = open_clean(browser) - seed_state(page) - navigate(page, "catalog") - set_theme(page, theme) - page.evaluate( - """() => { - const exps = document.querySelectorAll('[data-action="catalog-toggle-group"]'); - // Klikk de 2 første for å utvide - for (let i = 0; i < Math.min(2, exps.length); i++) exps[i].click(); - }""" - ) - page.wait_for_timeout(200) - shoot(page, f"03-catalog{suffix}") - ctx.close() - - # 4. Project — classify pyramide (scroll til classify report-slot) - ctx, page = open_clean(browser) - seed_state(page) - navigate(page, "project", project_id="proj-anpr-2026", project_tab="regulatory") - set_theme(page, theme) - import_reports(page, "proj-anpr-2026", ["classify"]) - shoot( - page, - f"04-project-classify-pyramide{suffix}", - scroll_to='[data-report-slot="classify"]', - ) - ctx.close() - - # 5. Project — ROS matrix - ctx, page = open_clean(browser) - seed_state(page) - navigate(page, "project", project_id="proj-anpr-2026", project_tab="security") - set_theme(page, theme) - import_reports(page, "proj-anpr-2026", ["ros"]) - shoot( - page, - f"05-project-ros-matrix{suffix}", - scroll_to='[data-report-slot="ros"]', - ) - ctx.close() - - # 6. Project — Cost distribution - ctx, page = open_clean(browser) - seed_state(page) - navigate(page, "project", project_id="proj-anpr-2026", project_tab="economy") - set_theme(page, theme) - import_reports(page, "proj-anpr-2026", ["cost"]) - shoot( - page, - f"06-project-cost-distribution{suffix}", - scroll_to='[data-report-slot="cost"]', - ) - ctx.close() - - browser.close() - - print() - print(f"Ferdig. Screenshots i {SCREENSHOTS_DIR.relative_to(PLUGIN_ROOT)}/") - - -if __name__ == "__main__": - main()