{
  "$schema": "https://schemas.ketlcloud.no/ai-system-card/v1.json",
  "version": "1.5.0",
  "generated_at": "2026-05-05",
  "system": {
    "name": "Ketl Innsiktsmaskinen",
    "vendor": "Ketl AS",
    "jurisdiction": "NO",
    "website": "https://ketlcloud.no",
    "contact": {
      "ai_governance": "ai-governance@ketlcloud.no",
      "security": "security@ketlcloud.no",
      "dpo": "personvern@ketlcloud.no"
    }
  },
  "regulatory_scope": {
    "eu_ai_act": {
      "applicable": true,
      "classification": "minimal-risk",
      "article_50_applies": true,
      "gpai_deployer": true,
      "gpai_provider": false,
      "annex_iii_high_risk": false,
      "notes": "Tjenesten er deployer av third-party GPAI (Anthropic Claude, OpenAI embeddings). Ingen egen fundamentmodell."
    },
    "nkom_register": {
      "registered": false,
      "planned_registration": "2026-Q3",
      "coordinator": "Nkom (Norwegian Communications Authority)",
      "readiness_checklist": "https://github.com/andreas-t-hjertaker/ketl-innsiktsmaskin-web/blob/main/docs/ai-governance/nkom-registration-checklist.md"
    },
    "gdpr": {
      "lawful_basis": [
        "contract",
        "legitimate-interest"
      ],
      "dpia_last_updated": "2026-04-15",
      "data_residency": "europe-west1 (Firestore, Cloud Functions)"
    }
  },
  "models": [
    {
      "name": "claude-sonnet-4-6",
      "vendor": "Anthropic",
      "purpose": "primary-assistant",
      "data_retention_days": 30,
      "used_for_training_by_vendor": false,
      "zero_retention_policy": true,
      "model_card_url": "https://docs.claude.com/en/docs/about-claude/models"
    },
    {
      "name": "claude-opus-4-6",
      "vendor": "Anthropic",
      "purpose": "deep-analysis-enterprise",
      "data_retention_days": 30,
      "used_for_training_by_vendor": false,
      "zero_retention_policy": true,
      "model_card_url": "https://docs.claude.com/en/docs/about-claude/models"
    },
    {
      "name": "claude-haiku-4-5-20251001",
      "vendor": "Anthropic",
      "purpose": "classification-autocomplete",
      "data_retention_days": 30,
      "used_for_training_by_vendor": false,
      "zero_retention_policy": true,
      "model_card_url": "https://docs.claude.com/en/docs/about-claude/models"
    },
    {
      "name": "text-embedding-3-large",
      "vendor": "OpenAI",
      "purpose": "public-data-embeddings",
      "data_retention_days": 0,
      "used_for_training_by_vendor": false,
      "zero_retention_policy": true,
      "scope_limitation": "Only public datasets (Brreg, SSB, Lovdata). Never customer data."
    }
  ],
  "data_usage": {
    "used": [
      "public-open-data (Brreg, SSB, Lovdata, Kartverket, Sodir, Finanstilsynet)",
      "api-usage-metadata (request-id, timestamp, tier — for billing)"
    ],
    "not_used": [
      "customer-prompts (not used for model training)",
      "customer-responses (not used for model training)",
      "customer-uploaded-files (SAF-T, accounts, reports — never trained on)",
      "cross-tenant-aggregation",
      "gdpr-article-9-special-categories (biometric, health, etc.)"
    ],
    "data_residency": "europe-west1",
    "third_country_transfers": {
      "anthropic_usa": {
        "mechanism": "SCC + EU-US Data Privacy Framework",
        "last_verified": "2026-03-01"
      },
      "openai_usa": {
        "mechanism": "SCC + EU-US Data Privacy Framework",
        "last_verified": "2026-03-01"
      }
    }
  },
  "transparency_measures": {
    "output_labelling": {
      "enabled": true,
      "description": "Alle AI-genererte svar merkes med icon + tekst 'Generert av AI basert på <kilder>' via AiGenerertBadge. Førstegangs-modal (AiFirstUseModal) vises for nye brukere med lenke til /ai-transparens. AI Act Art. 50-compliance operativt før 2026-08-02.",
      "rollout_status": "M1-complete",
      "first_use_disclosure": {
        "enabled": true,
        "component": "src/components/ai-first-use-modal.tsx",
        "persistence": "localStorage key 'ai_disclosure_ack'",
        "mounts_in": "src/app/layout.tsx (RootLayout)"
      }
    },
    "citations": {
      "enabled": true,
      "description": "Hver påstand lenker til konkret rad i kildedata."
    },
    "response_trace": {
      "enabled": true,
      "description": "Hver respons har unik response-id. Metadata (modell, verktøy, datakilder) kan slås opp i dashboard."
    },
    "prompt_response_audit_log": {
      "enabled": true,
      "description": "Hver AI-interaksjon produserer en audit-rad med prompt-UUID, respons-UUID, tidspunkt, varighet, modell, app-navn, path, bruker-UID og token-antall. Ingen prompt-tekst eller respons-tekst lagres — kun metadata. Se src/schemas/ai-audit-log.ts for full kontrakten.",
      "storage": "firestore/ai_audit_log",
      "retention_days": 365,
      "fields_stored": [
        "promptId (UUID v4)",
        "responseId (UUID v4)",
        "userId (auth uid eller 'anonymous')",
        "sessionId",
        "startedAtIso",
        "finishedAtIso",
        "durationMs",
        "modelName",
        "appName",
        "currentPath (uten query)",
        "promptTokenCount (approksimert)",
        "responseTokenCount (approksimert)",
        "status",
        "errorCode"
      ],
      "fields_NOT_stored": [
        "prompt-tekst",
        "respons-tekst",
        "hash av innhold",
        "IP-adresse",
        "geo-lokasjon",
        "query-parametere"
      ],
      "data_subject_rights": {
        "access": "GDPR art. 15 — selvbetjent på /dashboard/ai-innsyn (tabell, filtrert på userId)",
        "erasure": "GDPR art. 17 — selvbetjent sletting (enkeltvis eller samlet) på /dashboard/ai-innsyn",
        "contact": "personvern@ketlcloud.no",
        "portability": "GDPR art. 20 — JSON-eksport på /dashboard/ai-innsyn (schema https://schemas.ketlcloud.no/ai-audit-export/v1.json)",
        "self_service_ui": "https://ketlcloud.no/dashboard/ai-innsyn"
      }
    },
    "system_card_url": "https://ketlcloud.no/.well-known/ai-system-card.json",
    "public_transparency_page": "https://ketlcloud.no/ai-transparens"
  },
  "human_oversight": {
    "design_principle": "AI assisterer, menneske beslutter",
    "audit_log_retention_days": 365,
    "override_available": true,
    "escalation_contact": "ai-governance@ketlcloud.no",
    "kill_switch": {
      "implementation": "src/lib/firebase/ai-feature-flags.ts",
      "firestore_flag": "flags/ai_assistant_enabled",
      "default_state": "enabled",
      "audit_event": "ai_audit_log entry with status='error', errorCode='ai_kill_switch_active'",
      "user_facing_message": "AI-assistenten er midlertidig deaktivert. Vi jobber med å gjenopprette tjenesten — sjekk status på /sikkerhet eller kontakt support@ketl.no for mer informasjon.",
      "documented_in": "docs/ai-governance/internal-controls.md § 5"
    }
  },
  "risk_assessments": {
    "last_review": "2026-04-26",
    "review_cadence_months": 6,
    "known_limitations": [
      "Modellene kan hallusinere — vi demper med forpliktende kilde-sitering og tilgang til rådata.",
      "Offentlige registre kan inneholde feil i opprinnelsen; Ketl rapporterer data slik de foreligger.",
      "MCP-gateway er ratebegrenset; ved overforbruk returneres 429 og agent-klienter må retry-loope."
    ],
    "per_use_case": {
      "revisjon": "docs/ai-governance/risk-assessment-revisjon.md",
      "journalistikk": "docs/ai-governance/risk-assessment-journalistikk.md",
      "compliance": "docs/ai-governance/risk-assessment-compliance.md"
    }
  },
  "changelog": [
    {
      "version": "1.5.0",
      "date": "2026-05-05",
      "summary": "EPIC #104 M3 DRIFT-2 fix: AI kill-switch implementert i kode. `flags/ai_assistant_enabled` Firestore-flagg leses av `useChatSession` via real-time onSnapshot-subscription. Når aktivert short-circuiter `sendMessage` med standardmelding og logger hendelsen som `errorCode: 'ai_kill_switch_active'` i ai_audit_log. `human_oversight.kill_switch`-seksjon utvidet med implementasjons-, audit- og toggle-detaljer."
    },
    {
      "version": "1.4.0",
      "date": "2026-04-26",
      "summary": "EPIC #104 M3 første leveranse: docs/ai-governance/ etablert med internal-controls, per-use-case risk-assessments (revisjon, journalistikk, compliance), og Nkom-registrerings-checklist. Nye 'governance_documents' og 'risk_assessments.per_use_case' seksjoner peker til de nye filene."
    },
    {
      "version": "1.3.0",
      "date": "2026-04-25",
      "summary": "AI Act M1 fullført: AiFirstUseModal integrert i root-layout. Førstegangsbesøk viser tydelig AI-disclosure med lenke til /ai-transparens. Bruker-acknowledgment persisteres i localStorage."
    },
    {
      "version": "1.0.0",
      "date": "2026-04-22",
      "summary": "Initial release. Dekker AI Act M1 transparency for EPIC #104."
    },
    {
      "version": "1.1.0",
      "date": "2026-04-23",
      "summary": "EPIC #104 M2: Lagt til prompt_response_audit_log-seksjon som dokumenterer metadata-logging for AI-interaksjoner uten å lagre innhold."
    },
    {
      "version": "1.2.0",
      "date": "2026-04-24",
      "summary": "EPIC #104 M2 komplett: selvbetjent innsyn, eksport og sletting av AI-audit-rader på /dashboard/ai-innsyn. data_subject_rights oppdatert med art. 15/17/20-ruter og selvbetjent UI."
    }
  ],
  "governance_documents": {
    "internal_controls": "https://github.com/andreas-t-hjertaker/ketl-innsiktsmaskin-web/blob/main/docs/ai-governance/internal-controls.md",
    "risk_assessments": {
      "revisjon": "https://github.com/andreas-t-hjertaker/ketl-innsiktsmaskin-web/blob/main/docs/ai-governance/risk-assessment-revisjon.md",
      "journalistikk": "https://github.com/andreas-t-hjertaker/ketl-innsiktsmaskin-web/blob/main/docs/ai-governance/risk-assessment-journalistikk.md",
      "compliance": "https://github.com/andreas-t-hjertaker/ketl-innsiktsmaskin-web/blob/main/docs/ai-governance/risk-assessment-compliance.md"
    },
    "nkom_registration_checklist": "https://github.com/andreas-t-hjertaker/ketl-innsiktsmaskin-web/blob/main/docs/ai-governance/nkom-registration-checklist.md",
    "review_cadence_months": 6,
    "next_review": "2026-10-26"
  }
}
