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:
parent
9664bf1b1c
commit
e57dee5a03
28 changed files with 89 additions and 469 deletions
|
|
@ -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
|
- **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
|
- **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)
|
- **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.
|
- **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)
|
→ [Full documentation](plugins/ms-ai-architect/README.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-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/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`.
|
- `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/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.
|
- `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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
| 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 |
|
| 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
|
### Vendored design-system
|
||||||
|
|
||||||
Playground laster CSS fra `playground/vendor/playground-design-system/` — en vendored
|
Playground laster CSS fra `playground/vendor/playground-design-system/` — en vendored
|
||||||
|
|
|
||||||
|
|
@ -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
|
open plugins/ms-ai-architect/playground/ms-ai-architect-playground.html
|
||||||
```
|
```
|
||||||
|
|
||||||
### Screenshots
|
|
||||||
|
|
||||||
| Surface | Preview | What you see |
|
|
||||||
|---------|---------|--------------|
|
|
||||||
| Onboarding (18 shared fields, 5 grouped expansions) |  | 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) |  | 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) |  | 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) |  | 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) |  | 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) |  | 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
|
### Validation
|
||||||
|
|
||||||
| Test | Command | Coverage |
|
| 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 |
|
|
@ -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
|
Status: accepted
|
||||||
Date: 2026-04-30
|
Date: 2026-04-30
|
||||||
Deciders: AI-arkitekt, sikkerhetsarkitekt, seksjonsleder
|
Deciders: AI-arkitekt, sikkerhetsarkitekt, seksjonsleder
|
||||||
Consulted: personvernombud, juridisk rådgiver, Drift
|
Consulted: Datatilsynet, juridisk rådgiver, Drift
|
||||||
Informed: prosjekteierskap, KI-seksjonen
|
Informed: prosjekteierskap, AI-teamet
|
||||||
|
|
||||||
## Context and Problem Statement
|
## 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
|
## 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
|
- Customer-managed keys og Private Endpoints
|
||||||
- Custom modell-trening kapabilitet
|
- Custom modell-trening kapabilitet
|
||||||
- Total cost of ownership over 3 år
|
- Total cost of ownership over 3 år
|
||||||
- Driftbarhet for KI-seksjonen
|
- Driftbarhet for AI-teamet
|
||||||
|
|
||||||
## Considered Options
|
## Considered Options
|
||||||
|
|
||||||
|
|
@ -32,7 +32,7 @@ Chosen option: **Azure AI Foundry**, fordi det balanserer compliance, driftbarhe
|
||||||
|
|
||||||
### Consequences
|
### 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
|
- Good: customer-managed keys og Customer Lockbox tilgjengelig
|
||||||
- Bad: lock-in til Azure, men mitigert via standardiserte modell-formater (ONNX) og data-portabilitet
|
- 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
|
- Bad: høyere månedlig kostnad enn ren Azure ML — kompenseres ved redusert egen-drift
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# EU AI Act — Klassifisering: ANPR-trafikkanalyse
|
# EU AI Act — Klassifisering: Demosystem
|
||||||
|
|
||||||
System: ANPR-trafikkanalyse (Statens vegvesen)
|
System: Demosystem (Acme AS)
|
||||||
Beskrivelse: AI-system som identifiserer kjøretøy som har overtrådt fartsgrense via kameradata + kjøretøyregister
|
Beskrivelse: AI-system som identifiserer objekter som krever oppfølging via sensordata + objektregister
|
||||||
|
|
||||||
## Risikonivå
|
## Risikonivå
|
||||||
|
|
||||||
|
|
@ -13,7 +13,7 @@ Rolle: Provider og Deployer (utvikler internt + drifter selv)
|
||||||
|
|
||||||
## Begrunnelse
|
## 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
|
## Forpliktelser
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Sammenligning — Azure AI Foundry vs Azure ML + AKS
|
# Sammenligning — Azure AI Foundry vs Azure ML + AKS
|
||||||
|
|
||||||
System: ANPR-trafikkanalyse (Statens vegvesen)
|
System: Demosystem (Acme AS)
|
||||||
Sammenligningsdato: 2026-04-30
|
Sammenligningsdato: 2026-04-30
|
||||||
|
|
||||||
## Subjects
|
## Subjects
|
||||||
|
|
@ -14,8 +14,8 @@ Subject 2: Azure ML + AKS
|
||||||
|--------|------------------|----------------|--------|
|
|--------|------------------|----------------|--------|
|
||||||
| Time-to-prod | 6-8 uker for fundament | 12-16 uker | Foundry |
|
| 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 |
|
| Custom modell-trening | Integrert via Azure ML under panseret | Direkte Azure ML | Lik |
|
||||||
| Compliance-pakke for offentlig sektor | Inkludert | Må bygges selv | Foundry |
|
| Compliance-pakke for leverandøren | Inkludert | Må bygges selv | Foundry |
|
||||||
| Driftbarhet for KI-seksjonen | Lav driftbyrde, mest klikk-ops | Høy driftbyrde, full DevOps | 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 |
|
| 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 |
|
| Audit-logging på inferens | Innebygd | Må konfigureres manuelt | Foundry |
|
||||||
| Customer-managed keys | Tilgjengelig | Tilgjengelig | Lik |
|
| Customer-managed keys | Tilgjengelig | Tilgjengelig | Lik |
|
||||||
|
|
@ -29,12 +29,12 @@ Subject 2: Azure ML + AKS
|
||||||
|
|
||||||
## Sammendrag
|
## 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
|
## 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
|
## 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.
|
||||||
|
|
|
||||||
|
|
@ -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)
|
Vurderingsprosedyre: Annex VI (intern kontroll)
|
||||||
|
|
||||||
## Sjekkliste
|
## Sjekkliste
|
||||||
|
|
@ -12,8 +12,8 @@ Vurderingsprosedyre: Annex VI (intern kontroll)
|
||||||
| Teknisk dokumentasjon Annex IV komplett | partial | Mangler ytelsesmål per stratum |
|
| Teknisk dokumentasjon Annex IV komplett | partial | Mangler ytelsesmål per stratum |
|
||||||
| Logging av hendelser implementert | met | OpenTelemetry-spans i Azure Monitor |
|
| Logging av hendelser implementert | met | OpenTelemetry-spans i Azure Monitor |
|
||||||
| Transparens-instruksjoner skrevet | missing | Skal leveres innen 2026-09-01 |
|
| Transparens-instruksjoner skrevet | missing | Skal leveres innen 2026-09-01 |
|
||||||
| Menneskelig oversikt på saksbehandlere | met | Workflow-design godkjent av juridisk |
|
| Menneskelig oversikt på saksbehandler | met | Workflow-design godkjent av juridisk |
|
||||||
| Nøyaktighetsmål dokumentert | partial | 96.3% overall, men ikke per kjennemerke-region |
|
| 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 |
|
| Robusthet under adversarielle forhold | partial | Test-suite mangler skitne plater og natt-scenarier |
|
||||||
| Cybersikkerhetstiltak per Art. 15 | met | NSM Grunnprinsipper-vurdering bestått |
|
| Cybersikkerhetstiltak per Art. 15 | met | NSM Grunnprinsipper-vurdering bestått |
|
||||||
| Conformity assessment underskrevet | missing | Avhengig av FRIA-resultat |
|
| Conformity assessment underskrevet | missing | Avhengig av FRIA-resultat |
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Kostnadsestimat — ANPR-trafikkanalyse
|
# Kostnadsestimat — Demosystem
|
||||||
|
|
||||||
System: ANPR-trafikkanalyse (Statens vegvesen)
|
System: Demosystem (Acme AS)
|
||||||
Periode: 12 måneder fra produksjonssetting
|
Periode: 12 måneder fra produksjonssetting
|
||||||
Valuta: NOK
|
Valuta: NOK
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@ Valuta: NOK
|
||||||
|-----------|-------------------|
|
|-----------|-------------------|
|
||||||
| Azure AI Services (OCR + classification) | 64 000 |
|
| Azure AI Services (OCR + classification) | 64 000 |
|
||||||
| Azure OpenAI (forklaringsmodell) | 28 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 |
|
| Storage (blob + cosmos for audit) | 8 500 |
|
||||||
| Compute (Container Apps for orchestration) | 11 000 |
|
| Compute (Container Apps for orchestration) | 11 000 |
|
||||||
| Networking (Private Endpoints + egress) | 5 200 |
|
| Networking (Private Endpoints + egress) | 5 200 |
|
||||||
|
|
@ -35,7 +35,7 @@ Valuta: NOK
|
||||||
|
|
||||||
## Kostnadsdrivere
|
## Kostnadsdrivere
|
||||||
|
|
||||||
- Trafikkvolum: ~12 millioner ANPR-deteksjoner/mnd
|
- Datavolum: ~12 millioner Demosystem-deteksjoner/mnd
|
||||||
- Forklaring-prompt-tokens: ~250 tokens per flagged hendelse
|
- Forklaring-prompt-tokens: ~250 tokens per flagged hendelse
|
||||||
- Reservert kapasitet for 99.9% SLA
|
- Reservert kapasitet for 99.9% SLA
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
Metodikk: Datatilsynets veileder + ISO/IEC 29134
|
||||||
|
|
||||||
## Risikomatrise (5×5)
|
## Risikomatrise (5×5)
|
||||||
|
|
||||||
| Trussel | Sannsynlighet | Konsekvens | Score | Nivå |
|
| Trussel | Sannsynlighet | Konsekvens | Score | Nivå |
|
||||||
|---------|---------------|------------|-------|------|
|
|---------|---------------|------------|-------|------|
|
||||||
| Feilaktig kjennemerke-tolkning fører til urettmessig sanksjon | 3 | 4 | 12 | medium |
|
| Feilaktig objekt-ID-tolkning fører til urettmessig sanksjon | 3 | 4 | 12 | medium |
|
||||||
| Massiv lokasjonsdata-lekkasje fra kjøretøyregister | 2 | 5 | 10 | medium |
|
| Massiv lokasjonsdata-lekkasje fra objektregister | 2 | 5 | 10 | medium |
|
||||||
| AI-forklaring viser sensitiv kontekst om eier | 3 | 3 | 9 | medium |
|
| AI-forklaring viser sensitiv kontekst om eier | 3 | 3 | 9 | medium |
|
||||||
| Stratifisert bias mot utenlandske kjennemerker | 4 | 3 | 12 | medium |
|
| Stratifisert bias mot utenlandske objekt-ID | 4 | 3 | 12 | medium |
|
||||||
| Fysisk angrep på kameraer skaper deteksjonshull | 2 | 2 | 4 | low |
|
| Fysisk angrep på sensordata skaper deteksjonshull | 2 | 2 | 4 | low |
|
||||||
| Insider-misbruk for sporing av enkeltpersoner | 2 | 5 | 10 | medium |
|
| Insider-misbruk for sporing av enkeltpersoner | 2 | 5 | 10 | medium |
|
||||||
| Auto-flagging utløser kjedereaksjon ved system-feil | 1 | 5 | 5 | low |
|
| Auto-flagging utløser kjedereaksjon ved system-feil | 1 | 5 | 5 | low |
|
||||||
| Subject Access Request (GDPR Art. 15) ignoreres | 3 | 3 | 9 | medium |
|
| 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 |
|
| 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-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-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 |
|
| 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
|
## 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.
|
||||||
|
|
|
||||||
|
|
@ -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)
|
Hjemmel: EU AI Act Art. 27 (obligatorisk for offentlig sektor)
|
||||||
|
|
||||||
## Vurderte rettigheter
|
## 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 |
|
| 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 |
|
| 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 |
|
| 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 vegtrafikkloven §13 — likevel høy impact pga skala |
|
| 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å kjennemerker fra utenlandske registre (lavere ANPR-nøyaktighet) — kvartalsvis review |
|
| 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 |
|
| Ytringsfrihet og informasjonsfrihet | 0 | Ikke berørt |
|
||||||
| Forsamlingsfrihet | 0 | Ikke berørt |
|
| Forsamlingsfrihet | 0 | Ikke berørt |
|
||||||
| Religionsfrihet | 0 | Ikke berørt |
|
| Religionsfrihet | 0 | Ikke berørt |
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,20 @@
|
||||||
# Lisens-kapabilitetsmatrise — ANPR-trafikkanalyse
|
# Lisens-kapabilitetsmatrise — Demosystem
|
||||||
|
|
||||||
System: ANPR-trafikkanalyse (Statens vegvesen)
|
System: Demosystem (Acme AS)
|
||||||
Vurderingsdato: 2026-04-30
|
Vurderingsdato: 2026-04-30
|
||||||
|
|
||||||
## Matrise
|
## Matrise
|
||||||
|
|
||||||
| Kapabilitet | M365 E3 | M365 E5 | Copilot for M365 | Copilot Studio | Azure AI Foundry |
|
| 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 |
|
| Custom modell-trening | missing | missing | missing | missing | available |
|
||||||
| Audit-logging på AI-input | missing | available | available | available | available |
|
| Audit-logging på AI-input | missing | available | available | available | available |
|
||||||
| Customer-managed keys | missing | available | conditional | conditional | available |
|
| Customer-managed keys | missing | available | conditional | conditional | available |
|
||||||
| Private Endpoints | missing | available | missing | 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 |
|
| 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 |
|
| Real-time inference (<100ms) | missing | missing | missing | missing | available |
|
||||||
| Batch-inference for nattlige jobber | missing | missing | missing | missing | available |
|
| Batch-inference for nattlige jobber | missing | missing | missing | missing | available |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Migrasjonsplan — ANPR-trafikkanalyse
|
# Migrasjonsplan — Demosystem
|
||||||
|
|
||||||
System: ANPR-trafikkanalyse (Statens vegvesen)
|
System: Demosystem (Acme AS)
|
||||||
Fra: On-prem OCR + manuell klassifisering
|
Fra: On-prem OCR + manuell klassifisering
|
||||||
Til: Azure AI Foundry + saksbehandler-co-pilot
|
Til: Azure AI Foundry + saksbehandler-co-pilot
|
||||||
|
|
||||||
|
|
@ -26,29 +26,29 @@ Suksesskriterier:
|
||||||
Varighet: 8 uker
|
Varighet: 8 uker
|
||||||
|
|
||||||
Milepæler:
|
Milepæler:
|
||||||
- Treningsdata kuratert (200k norske kjennemerker, stratifisert)
|
- Treningsdata kuratert (200k norske objekt-ID, stratifisert)
|
||||||
- Custom modell trent på Azure ML
|
- Custom modell trent på Azure ML
|
||||||
- Baseline-nøyaktighet etablert (mål: ≥96% F1)
|
- Baseline-nøyaktighet etablert (mål: ≥96% F1)
|
||||||
- Bias-evaluering på utenlandske registre fullført
|
- Bias-evaluering på utenlandske registre fullført
|
||||||
|
|
||||||
Suksesskriterier:
|
Suksesskriterier:
|
||||||
- F1 ≥ 96% overall, ≥ 92% per kjøretøy-segment
|
- F1 ≥ 96% overall, ≥ 92% per objekter-segment
|
||||||
- Drift-deteksjon kalibrert med terskel
|
- Drift-deteksjon kalibrert med terskel
|
||||||
- ROS-revisjon godkjent
|
- ROS-revisjon godkjent
|
||||||
|
|
||||||
### Fase 3 — Saksbehandler-co-pilot (uker 15-22)
|
### Fase 3 — saksbehandler-co-pilot (uker 15-22)
|
||||||
|
|
||||||
Varighet: 8 uker
|
Varighet: 8 uker
|
||||||
|
|
||||||
Milepæler:
|
Milepæler:
|
||||||
- Forklaringsmodell (GPT-4 Turbo) integrert via Foundry
|
- 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
|
- Workflow: AI flagger → saksbehandler reviewer → klar for sanksjon
|
||||||
- Brukertest med 12 saksbehandlere fra ulike regioner
|
- Brukertest med 12 saksbehandler fra ulike regioner
|
||||||
|
|
||||||
Suksesskriterier:
|
Suksesskriterier:
|
||||||
- Saksbehandlingstid -40% vs baseline
|
- Saksbehandlingstid -40% vs baseline
|
||||||
- Saksbehandler-tillit >7/10 i post-pilot survey
|
- saksbehandler-tillit >7/10 i post-pilot survey
|
||||||
- Ingen kritiske UX-feil
|
- Ingen kritiske UX-feil
|
||||||
|
|
||||||
### Fase 4 — Compliance og produksjonssetting (uker 23-28)
|
### Fase 4 — Compliance og produksjonssetting (uker 23-28)
|
||||||
|
|
@ -71,7 +71,7 @@ Suksesskriterier:
|
||||||
| Risiko | Sannsynlighet | Konsekvens | Tiltak |
|
| Risiko | Sannsynlighet | Konsekvens | Tiltak |
|
||||||
|--------|---------------|------------|--------|
|
|--------|---------------|------------|--------|
|
||||||
| Custom modell underyter mot 96% mål | medium | high | Backup-strategi: bruk Azure AI Vision OCR som fallback |
|
| 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 |
|
| 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 |
|
| Cost-overrun ved skalering | medium | medium | Reserved capacity-binding etter fase 3 |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
POC-mål: Validere at Azure AI Foundry kan dekke OCR + forklaring + audit innen tids- og kostbudsjett
|
||||||
|
|
||||||
## Faser
|
## Faser
|
||||||
|
|
@ -12,7 +12,7 @@ Varighet: 2 uker
|
||||||
Milepæler:
|
Milepæler:
|
||||||
- Foundry hub + project i West Europe
|
- Foundry hub + project i West Europe
|
||||||
- Identity og networking konfigurert
|
- Identity og networking konfigurert
|
||||||
- Sample-data uploadet (10k anonymiserte kjennemerker)
|
- Sample-data uploadet (10k anonymiserte objekt-ID)
|
||||||
|
|
||||||
Suksesskriterier:
|
Suksesskriterier:
|
||||||
- Inferens-endpoint nåbart fra dev-Vnet via Private Endpoint
|
- Inferens-endpoint nåbart fra dev-Vnet via Private Endpoint
|
||||||
|
|
@ -25,7 +25,7 @@ Varighet: 3 uker
|
||||||
|
|
||||||
Milepæler:
|
Milepæler:
|
||||||
- Pre-trent Azure AI Vision OCR pilotert
|
- 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
|
- Sammenligning av accuracy/latency mellom de to
|
||||||
|
|
||||||
Suksesskriterier:
|
Suksesskriterier:
|
||||||
|
|
@ -40,11 +40,11 @@ Varighet: 2 uker
|
||||||
Milepæler:
|
Milepæler:
|
||||||
- GPT-4 Turbo via Foundry integrert
|
- GPT-4 Turbo via Foundry integrert
|
||||||
- Prompt-template for forklaring av flagged sak
|
- 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:
|
Suksesskriterier:
|
||||||
- Forklaring referer til konfidens og kontekst korrekt i 95% av tilfellene
|
- 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
|
- Prompt-tokens under 250 i snitt per sak
|
||||||
|
|
||||||
### Fase 4 — Compliance-pre-check (uke 8)
|
### Fase 4 — Compliance-pre-check (uke 8)
|
||||||
|
|
@ -54,7 +54,7 @@ Varighet: 1 uke
|
||||||
Milepæler:
|
Milepæler:
|
||||||
- Audit-logg mot EU AI Act Art. 12-krav
|
- Audit-logg mot EU AI Act Art. 12-krav
|
||||||
- Customer-managed keys verifisert
|
- Customer-managed keys verifisert
|
||||||
- Pre-DPIA-sjekk gjort med personvernombud
|
- Pre-DPIA-sjekk gjort med Datatilsynet
|
||||||
|
|
||||||
Suksesskriterier:
|
Suksesskriterier:
|
||||||
- Audit-logg dekker 100% av inferences med tidsstempel + bruker
|
- 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 |
|
| 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 |
|
| 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 |
|
| Audit-logg-format ikke kompatibelt med Sentinel | low | medium | Test integrasjon i fase 1 |
|
||||||
|
|
||||||
## Total varighet
|
## Total varighet
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# EU AI Act — Krav for høyrisiko provider+deployer
|
# 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
|
Klassifisering: høy risiko, rolle Provider+Deployer
|
||||||
|
|
||||||
## Krav
|
## Krav
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,22 @@
|
||||||
# Arkitekturgjennomgang — ANPR-trafikkanalyse
|
# Arkitekturgjennomgang — Demosystem
|
||||||
|
|
||||||
System: ANPR-trafikkanalyse (Statens vegvesen)
|
System: Demosystem (Acme AS)
|
||||||
Vurderingsdato: 2026-04-30
|
Vurderingsdato: 2026-04-30
|
||||||
Reviewers: AI-arkitekt, sikkerhetsarkitekt, personvernombud
|
Reviewers: AI-arkitekt, sikkerhetsarkitekt, Datatilsynet
|
||||||
|
|
||||||
## Funn
|
## Funn
|
||||||
|
|
||||||
| ID | Severity | Lokasjon | Anbefaling |
|
| 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-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-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-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-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-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
|
## Sammendrag
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
Metodikk: NS 5814 / ISO 31000 + AI-trusselbibliotek
|
||||||
|
|
||||||
## Risikomatrise (5×5)
|
## Risikomatrise (5×5)
|
||||||
|
|
@ -14,7 +14,7 @@ Metodikk: NS 5814 / ISO 31000 + AI-trusselbibliotek
|
||||||
| Klage-saksbehandling overbelastet ved skalering | 4 | 3 | 12 | medium |
|
| Klage-saksbehandling overbelastet ved skalering | 4 | 3 | 12 | medium |
|
||||||
| Datatap pga manglende georedundans | 1 | 5 | 5 | low |
|
| Datatap pga manglende georedundans | 1 | 5 | 5 | low |
|
||||||
| Misbruk av AI-forklaring som bevis | 3 | 4 | 12 | medium |
|
| 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)
|
## Radar-akser (7 dimensjoner)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
Rammeverk: NSM Grunnprinsipper + Microsoft Cloud Security + EU AI Act Art. 15
|
||||||
|
|
||||||
## Score per dimensjon
|
## Score per dimensjon
|
||||||
|
|
@ -30,7 +30,7 @@ Rammeverk: NSM Grunnprinsipper + Microsoft Cloud Security + EU AI Act Art. 15
|
||||||
| ID | Severity | Lokasjon | Anbefaling |
|
| ID | Severity | Lokasjon | Anbefaling |
|
||||||
|----|----------|----------|------------|
|
|----|----------|----------|------------|
|
||||||
| S-01 | high | Identity | Aktivér PIM på alle serviceprinciper innen 2026-06-01 |
|
| 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-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-04 | low | Network | Periodisk verifikasjon av Private Endpoint-konfigurasjon |
|
||||||
| S-05 | medium | Logging | Implementer ML-basert avviksdeteksjon på AI-output-rate |
|
| S-05 | medium | Logging | Implementer ML-basert avviksdeteksjon på AI-output-rate |
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
# Beslutningsnotat — ANPR-trafikkanalyse
|
# Beslutningsnotat — Demosystem
|
||||||
|
|
||||||
System: ANPR-trafikkanalyse (Statens vegvesen)
|
System: Demosystem (Acme AS)
|
||||||
Dato: 2026-04-30
|
Dato: 2026-04-30
|
||||||
Til: Direktør for Digital og IT
|
Til: Direktør for Digital og IT
|
||||||
Fra: KI-seksjonen
|
Fra: AI-teamet
|
||||||
|
|
||||||
## Verdict
|
## Verdict
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ Arkitekturen er teknisk solid og økonomisk forsvarlig (P50 NOK 1.7M/år), men c
|
||||||
|
|
||||||
## Restrisiko
|
## 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
|
## Anbefaling
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
## 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
|
## 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
|
## Hvordan beslutninger tas
|
||||||
|
|
||||||
|
|
@ -20,6 +20,6 @@ Som registrert har du rett til innsyn (GDPR Art. 15), retting (Art. 16), slettin
|
||||||
|
|
||||||
## Kontakt
|
## Kontakt
|
||||||
|
|
||||||
Personvernombud: pvo@vegvesen.no
|
Personvernombud: pvo@Acme.no
|
||||||
Tilsyn: Datatilsynet — postkasse@datatilsynet.no
|
Tilsyn: Datatilsynet — postkasse@datatilsynet.no
|
||||||
EU AI Act-tilsyn: under etablering (Digitaliseringsdirektoratet er forventet)
|
EU AI Act-tilsyn: under etablering (Digitaliseringsdirektoratet er forventet)
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
# AI-arkitekturutredning — ANPR-trafikkanalyse for Statens vegvesen
|
# AI-arkitekturutredning — Demosystem for Acme AS
|
||||||
|
|
||||||
## 1. Bakgrunn og formål
|
## 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
|
## 2. Mandat
|
||||||
|
|
||||||
|
|
@ -17,7 +17,7 @@ Utredningen skal:
|
||||||
|
|
||||||
Utredningen kombinerer:
|
Utredningen kombinerer:
|
||||||
- Kvalitativ analyse av compliance-krav per relevante lover og forskrifter
|
- 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
|
- Risikoanalyse per NS 5814 og DPIA per Datatilsynets veileder
|
||||||
- Markedsundersøkelse av tilgjengelige plattformer fra Azure, AWS og GCP
|
- Markedsundersøkelse av tilgjengelige plattformer fra Azure, AWS og GCP
|
||||||
|
|
||||||
|
|
@ -25,12 +25,12 @@ Utredningen kombinerer:
|
||||||
|
|
||||||
### 4.1 Compliance
|
### 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
|
### 4.2 Teknologivalg
|
||||||
|
|
||||||
Azure AI Foundry er anbefalt primær plattform fordi:
|
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
|
- Customer-managed keys og Customer Lockbox tilgjengelig
|
||||||
- Custom modell-trening via integrert Azure ML
|
- Custom modell-trening via integrert Azure ML
|
||||||
- Norsk dataresidens (West Europe + EU Data Boundary)
|
- Norsk dataresidens (West Europe + EU Data Boundary)
|
||||||
|
|
@ -41,7 +41,7 @@ Azure AI Foundry er anbefalt primær plattform fordi:
|
||||||
|
|
||||||
### 4.4 Risiko
|
### 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
|
## 5. Konklusjon
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue