diff --git a/plugins/ms-ai-architect/playground/ms-ai-architect-playground.html b/plugins/ms-ai-architect/playground/ms-ai-architect-playground.html index 3777921..3431e91 100644 --- a/plugins/ms-ai-architect/playground/ms-ai-architect-playground.html +++ b/plugins/ms-ai-architect/playground/ms-ai-architect-playground.html @@ -2508,13 +2508,25 @@ const reqKey = checklistTbl.headers.find(function (h) { return /krav|requirement/i.test(h); }) || checklistTbl.headers[0]; const statusKey = checklistTbl.headers.find(function (h) { return /status/i.test(h); }) || checklistTbl.headers[1]; const evidKey = checklistTbl.headers.find(function (h) { return /bevis|evidence/i.test(h); }) || checklistTbl.headers[2]; + // Bucket-klassifisering — støtter bade engelske og norske status-markører. + const bucketOf = function (status) { + const s = (status || '').toLowerCase().trim(); + if (/^(pass|met|ok|bestått|bestatt|godkjent|approved|done)$/.test(s)) return 'passed'; + if (/^(partial|conditional|betinget|delvis|in-progress|active)$/.test(s)) return 'conditional'; + if (/^(missing|failed|avvist|underkjent|fail|rejected|blocked)$/.test(s)) return 'failed'; + return 'conditional'; + }; const checklist = checklistTbl.rows.map(function (row) { + const status = (row[statusKey] || '').toLowerCase().trim(); return { requirement: row[reqKey] || '', - status: (row[statusKey] || '').toLowerCase().trim(), + status: status, + bucket: bucketOf(status), evidence: row[evidKey] || '' }; }); + const buckets = { passed: [], conditional: [], failed: [] }; + checklist.forEach(function (it) { buckets[it.bucket].push(it); }); const deadlinesTbl = parseTable(md, /##\s*Frister/i); const deadlines = deadlinesTbl ? deadlinesTbl.rows.map(function (row) { const dateKey = deadlinesTbl.headers.find(function (h) { return /dato|date/i.test(h); }) || deadlinesTbl.headers[0]; @@ -2526,7 +2538,7 @@ status: (row[stKey] || '').toLowerCase().trim() }; }) : []; - return { ok: true, data: { checklist: checklist, deadlines: deadlines } }; + return { ok: true, data: { checklist: checklist, buckets: buckets, deadlines: deadlines } }; } function parseMatrixRisk(md) { @@ -3162,6 +3174,29 @@ } function renderConformity(data, slot) { + const buckets = data.buckets || { passed: [], conditional: [], failed: [] }; + const cardFor = function (bucket, label) { + const items = buckets[bucket] || []; + const cards = items.length ? items.map(function (it, idx) { + return '
' + + '
C-' + String(idx + 1).padStart(2, '0') + ' — ' + escapeHtml(it.requirement) + '
' + + '
Bevis: ' + escapeHtml(it.evidence || '—') + '
' + + '
'; + }).join('') : '
Ingen krav
'; + return '
' + + '
' + + '' + escapeHtml(label) + '' + + '' + items.length + '' + + '
' + + cards + + '
'; + }; + const kanbanHtml = '
' + + cardFor('passed', 'Bestått') + + cardFor('conditional', 'Med betingelser') + + cardFor('failed', 'Ikke bestått') + + '
'; + const stateOf = function (status) { const s = (status || '').toLowerCase(); if (s === 'passed' || s === 'met' || s === 'done') return 'passed'; @@ -3182,38 +3217,24 @@ ''; }).join(''); timelineHtml = - '
' + - '
' + - '
' + - milestones + + '

Frister

' + + '
' + + '
' + + '
' + + milestones + + '
' + '
' + - '
'; + ''; } - const sevForStatus = function (status) { - const s = (status || '').toLowerCase(); - if (s === 'met') return 'low'; - if (s === 'partial') return 'medium'; - if (s === 'missing') return 'critical'; - return 'info'; - }; - const items = (data.checklist || []).map(function (it, idx) { - return '
  • ' + - '' + - 'C-' + String(idx + 1).padStart(2, '0') + '' + - '' + escapeHtml(it.requirement) + '' + - 'Bevis: ' + escapeHtml(it.evidence || '—') + ' · ' + escapeHtml(it.status || '—') + '' + - '
  • '; - }).join(''); - const findingsHtml = - '
    ' + - '
    ' + - '
    ' + - '
    Sjekkliste' + (data.checklist || []).length + '
    ' + - '
      ' + items + '
    ' + - '
    ' + - '
    ' + - '
    '; - slot.innerHTML = timelineHtml + findingsHtml; + + const body = kanbanHtml + timelineHtml; + slot.innerHTML = renderPageShell({ + eyebrow: 'SAMSVAR', + title: data.title || 'Samsvarsvurdering (Art. 43)', + lede: data.lede || 'Annex IV-sjekkliste fordelt på Bestått / Med betingelser / Ikke bestått.', + verdict: data.verdict || inferVerdict(data, 'conformity-checklist'), + keyStats: data.keyStats || inferKeyStats(data, 'conformity-checklist') + }, body); } function renderDpia(data, slot) { diff --git a/plugins/ms-ai-architect/playground/test-fixtures/conformity.md b/plugins/ms-ai-architect/playground/test-fixtures/conformity.md index 4d2f35f..8caa13f 100644 --- a/plugins/ms-ai-architect/playground/test-fixtures/conformity.md +++ b/plugins/ms-ai-architect/playground/test-fixtures/conformity.md @@ -7,18 +7,18 @@ Vurderingsprosedyre: Annex VI (intern kontroll) | Krav | Status | Bevis | |------|--------|-------| -| Risk Management System dokumentert | met | RMS-rapport v2.1 (2026-04-15) | -| Treningsdata-governance med kvalitetskriterier | met | Data-governance handbook §4.2 | -| 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å 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 | -| EU declaration of conformity utstedt | missing | Avhenger av Art. 47 | -| CE-merking påført | missing | Markedsplassering ikke aktuell (intern bruk) — vurder om Art. 48 gjelder | +| Risk Management System dokumentert | bestått | RMS-rapport v2.1 (2026-04-15) | +| Treningsdata-governance med kvalitetskriterier | bestått | Data-governance handbook §4.2 | +| Teknisk dokumentasjon Annex IV komplett | betinget | Mangler ytelsesmål per stratum | +| Logging av hendelser implementert | bestått | OpenTelemetry-spans i Azure Monitor | +| Transparens-instruksjoner skrevet | avvist | Skal leveres innen 2026-09-01 | +| Menneskelig oversikt på saksbehandler | bestått | Workflow-design godkjent av juridisk | +| Nøyaktighetsmål dokumentert | betinget | 96.3% overall, men ikke per objekt-ID-region | +| Robusthet under adversarielle forhold | betinget | Test-suite mangler skitne plater og natt-scenarier | +| Cybersikkerhetstiltak per Art. 15 | bestått | NSM Grunnprinsipper-vurdering bestått | +| Conformity assessment underskrevet | avvist | Avhengig av FRIA-resultat | +| EU declaration of conformity utstedt | avvist | Avhenger av Art. 47 | +| CE-merking påført | avvist | Markedsplassering ikke aktuell (intern bruk) — vurder om Art. 48 gjelder | ## Frister