chore(ms-ai-architect): scrub identifying references from fixtures + remove screenshots

Removes:
- All 6 PNG screenshots (playground/screenshots/) and the capture script
  (scripts/screenshots/capture-playground.py).
- "Screenshots" section from plugin README.
- "Screenshot-suite" section from plugin CLAUDE.md.
- Screenshots bullet from marketplace root README's ms-ai-architect listing.

Scrubs the 17 synthetic fixtures + CHANGELOG/CLAUDE/README of identifying
references: organization names, government-agency names, agency-specific
terminology, sector-specific use cases. Replaced with generic placeholder
data ("Acme AS" / "Demosystem") that exercises the same parser archetypes.

Plugin's domain-target wording (Datatilsynet, offentlig sektor, offentlig
myndighet, rettshåndhevelse, NS 5814, Utredningsinstruksen, EU AI Act
Annex III categories) is intact — those describe the plugin's intended
audience, not any specific entity.

This is a cleanup commit. Earlier git history still contains the prior
references; force-push or rebase is required if scrubbing the history is
desired. That decision is out of scope here — please run it separately
if needed.

Verified post-scrub:
- bash tests/validate-plugin.sh -> 215/215 PASS
- bash tests/run-e2e.sh --playground -> 240/240 PASS (170 + 70)
This commit is contained in:
Kjell Tore Guttormsen 2026-05-03 20:53:49 +02:00
commit e57dee5a03
28 changed files with 89 additions and 469 deletions

View file

@ -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 `<head>`-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)

View file

@ -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.

View file

@ -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

View file

@ -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 |

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -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 |

View file

@ -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

View file

@ -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.

View file

@ -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 |

View file

@ -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 |

View file

@ -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 |

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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 |

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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. 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. 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()