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 +
+ '
';
+ '';
}
- 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 =
- '
';
- 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