Unveränderter Stand von certvia/dev (a48c5fb) plus Craftvia-Spezifikation und Brandbook unter docs/craftvia/. ISMS-Module werden im Folgecommit entfernt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
15 KiB
Feindesign B1 — Assessment und Readiness für zwei Frameworks
Stand: 2026-08-27 · Branch: feature/iso27001-framework-mapping · Status: Entwurf zur Abnahme
Ausgangslage: AP1–AP5 sind umgesetzt. Ein ISO-Mandant hat Dokumente, SoA-Modell, Kennzahlen, Managementbewertung und Korrekturmaßnahmen. Was fehlt, ist die Bewertungs- und Readiness-Sicht:
maturity.ts,scope-filter.ts,assessment-level.tsundreadiness.tskennen kein Framework und rechnen durchgängig VDA ISA — AL2/AL3, Prüfziele, Reifegrad 0–3, MUSS/SOLL.Belegter Bruch:
soa-context.ts:151undexport-context.ts:49lesencontrolAssessment. Keine einzige Stelle liestsoaEntry. Das in AP3 gebaute SoA-Modul ist von der Auswertung abgekoppelt — die Daten liegen da, die Readiness greift nicht darauf zu.
Grundlage: docs/KONZEPT-framework-iso27001.md (Lane 3), docs/FRAMEWORK-MAPPING-ISO27001.md,
docs/UEBERGABE-framework-iso27001.md.
1. Leitentscheidung: die Belegbasis liegt unterhalb der Framework-Strategie
Es werden nicht zwei Engines gebaut. Der Belegstatus eines Controls — ist die zuständige Richtlinie freigegeben, existiert das Verfahren, hängt ein Asset dran, gibt es einen Wirksamkeitsnachweis — ist eine Tatsache über die Organisation, keine Frage der Norm. Ob R08 freigegeben ist, ändert sich nicht dadurch, ob ISO oder VDA ISA danach fragt.
Würde man die Belegbasis mitparallelisieren, entstünden zwei Bewertungen derselben Realität, die auseinanderlaufen können. Im Audit steht dann „Berechtigungsvergabe: TISAX Reifegrad 3" neben „ISO: teilweise umgesetzt" — ein Widerspruch über denselben Sachverhalt.
Regel: eine Belegbasis, zwei Bewertungen.
Schicht 3 Sichten /soa · /audit-readiness · Exporte · Wizard-Schritte → Reiter je Framework
Schicht 2 Strategie Scope · Zielwert · Bewertung · Vokabular → je Framework
Schicht 1 Belegbasis loadEvidenceResolver → ControlEvidence → GETEILT
Schicht 0 Fachdaten PolicyDocument · Evidence · Asset · Risk · Measure → GETEILT
Das ist derselbe Schnitt wie bei den Richtlinien: ein Umsetzungstext, zwei Anforderungssichten.
2. Was generalisiert wird (Schicht 1)
ControlEvidence (src/lib/maturity.ts:54) ist bereits framework-neutral — Richtlinienstatus,
Verfahrensstatus, Asset-/Risiko-Verknüpfung, operativer Wirksamkeitsnachweis. Nur der Eingabetyp des
Resolvers ist TISAX-spezifisch.
Änderung: C5ControlSpec (maturity.ts:16) wird auf ein neutrales ControlSpec reduziert:
export interface ControlSpec {
control: string; // "4.1.2" | "A.8.5"
title: string;
policy: string[]; // ["R08"]
verfahren: string[]; // ["VA-03"]
needsAsset: boolean;
needsRisk: boolean;
}
// C5ControlSpec extends ControlSpec { target: number } — TISAX-Zusatzfeld bleibt dort
loadEvidenceResolver(db, completeControls) nimmt künftig ControlSpec. Für TISAX ändert sich
nichts — C5ControlSpec erfüllt das Interface.
ISO-Specs kommen aus dem Mapping, nicht von Hand
mapping-iso.json trägt je Anforderung bereits policy (R-Code) und verfahren (VA-Codes). Daraus
lässt sich der ISO-ControlSpec erzeugen. needsAsset/needsRisk werden über den vorhandenen
Crosswalk ISO_TO_ISA (src/lib/iso-isa-crosswalk.ts, 87 der 120) vom ISA-Spec geerbt; für die
33 ISO-eigenen Abschnitte werden sie explizit gesetzt — sinnvoll nur bei A.5.9 (needsAsset) sowie
6.1.2/6.1.3/8.2/8.3 (needsRisk).
Umsetzung: _generate_iso.py erzeugt zusätzlich src/lib/control-specs-iso.ts — analog zu
control-titles-iso.ts und iso-isa-crosswalk.ts. Damit bleibt das Mapping die einzige Quelle und
niemand pflegt eine zweite Liste.
3. Die Strategie-Schnittstelle (Schicht 2)
export type FrameworkKey = "TISAX" | "ISO_27001";
/** Bewertung eines Controls — je Framework ein eigener Typ, nie gemischt. */
export type Verdict =
| { kind: "maturity"; suggested: 0 | 1 | 2 | 3; confirmed: number | null; target: 2 | 3 }
| { kind: "status"; applicable: boolean; suggested: ImplStatus; confirmed: ImplStatus | null };
export type ImplStatus = "umgesetzt" | "teilweise" | "geplant";
export interface AssessmentRow {
control: string;
title: string;
spec: ControlSpec;
evidence: ControlEvidence; // aus Schicht 1, identisch für beide Frameworks
verdict: Verdict; // je Framework interpretiert
gaps: OpenPoint[];
}
export interface FrameworkStrategy {
key: FrameworkKey;
/** Anzeigename für Reiter und Berichte. */
label: string; // "TISAX / VDA ISA 2027" | "ISO/IEC 27001:2022"
/** Datei im Vorlagenpaket. */
mappingFile: string; // "mapping.json" | "mapping-iso.json"
/** Controls im Geltungsbereich — TISAX: AL + Prüfziele · ISO: Anwendbarkeit aus der SoA. */
controlsInScope(db: TenantDb): Promise<ControlSpec[]>;
/** Bewertung eines Controls aus geteiltem Beleg + framework-eigener Regel. */
evaluate(spec: ControlSpec, ev: ControlEvidence, ctx: EvalContext): Verdict;
/** Offene Punkte, die aus der Lücke zum Zielwert folgen. */
gaps(spec: ControlSpec, ev: ControlEvidence, v: Verdict): OpenPoint[];
/** Kennzahl und Textband — framework-eigenes Vokabular, kein gemeinsamer Nenner. */
summarise(rows: AssessmentRow[]): ReadinessSummary;
}
buildControlRows (soa-context.ts:146) wird zu buildAssessment(db, tenantId, framework) und
delegiert an die Strategie. Die Belegauflösung bleibt, wo sie ist.
TisaxStrategy — verhaltensgleich extrahieren
Reine Umverdrahtung, kein neues Verhalten: loadScopeInput + controlsInScope → controlsInScope,
suggestMaturity + targetMaturity → evaluate, openPoints → gaps, computeReadiness →
summarise. Regressionsschutz: Snapshot-Test gegen die heutige Ausgabe (siehe §7).
IsoStrategy — neu
| Aspekt | Regel |
|---|---|
| Scope | SoaEntry.applicable = true. Kein AL, keine Prüfziele. Klauseln 4–10 sind immer im Scope (nicht Gegenstand der Anwendbarkeit). |
| Zielwert | implementationStatus = "umgesetzt" für jedes anwendbare Control. Keine Stufung. |
| Vorschlag | aus ControlEvidence: Richtlinie und Verfahren validiert + geforderte Verknüpfungen vorhanden → umgesetzt; teilweise belegt → teilweise; sonst geplant. |
| Bestätigung | SoaEntry.implementationStatus ist der bestätigte Wert; der Vorschlag überschreibt ihn nie (Muster wie ControlAssessment.suggested / confirmedValue). |
| Lücken | fehlende Begründung, fehlender Nachweis, Status ≠ „umgesetzt" bei anwendbarem Control. |
4. Vorbelegung bei Doppel-Framework — gegen Doppelerfassung
Führt ein Mandant beide Normen, darf der ISB nicht zweimal dasselbe beantworten. Über
ISO_TO_ISA ist bekannt, welches ISA-Control denselben Bibliotheksabschnitt trägt.
Regel: Ist das zugehörige ISA-Control bestätigt und erreicht seinen Zielreifegrad, schlägt die
ISO-Sicht umgesetzt vor — mit Verweis auf denselben Nachweis. Der ISB bestätigt, das System
setzt nichts automatisch.
Für die 33 ISO-Anforderungen ohne ISA-Gegenstück (Managementsystem-Klauseln, Clear Desk, DLP, Kapazität, Zeitsynchronisation …) gibt es keine Vorbelegung — sie werden regulär bewertet. Das ist zugleich die ehrliche Aussage an den Kunden: das ist die Delta-Arbeit, die ISO gegenüber TISAX zusätzlich verlangt. Diese Liste ist ein verkaufbares Ergebnis für sich.
5. Sichten und Reiter (Schicht 3)
| Bereich | Reiter ISO / TISAX | Begründung |
|---|---|---|
Controls- / SoA-Sicht (/soa) |
ja | zwei Kataloge, zwei Zielsysteme |
Readiness (/audit-readiness) |
ja | je Norm eine eigene Aussage und ein eigenes Vokabular |
| Exporte | ja | VDA-ISA-Export bleibt TISAX; SoA und Annex-A-Gap sind ISO |
Richtlinien (/policies) |
nein | ein Dokumentensatz; Parallelanzeige im Dokument ist gebaut |
| Nachweise | nein | ein Beleg belegt eine Tatsache, unabhängig von der fragenden Norm |
| Assets, Risiken, Vorfälle, Lieferanten, Aufgaben | nein | framework-neutral |
Reiter-Verhalten: ein aktives Framework → kein Reiter, direkte Anzeige. Zwei aktive Frameworks →
Reiter, Vorauswahl TenantFramework.isPrimary. Die Auswahl gehört in die URL (?fw=iso), damit
Deep-Links und Berichte reproduzierbar sind.
Harte Regel: keine gemischte Gesamtzahl. Ein „Erfüllungsgrad 87 %" über beide Normen ist fachlich sinnlos — ein Reifegrad 0–3 und ein Umsetzungsstatus lassen sich nicht mitteln. Je Norm eine Kennzahl, immer getrennt ausgewiesen.
6. Vokabular
REIFEGRAD_BANDS (readiness.ts:16) ist TISAX-Sprache („Assessment-reif", „AL-Ziel"). Für ISO
gehören eigene Bänder auf Basis des Umsetzungsgrads — Vorschlag:
| Anteil „umgesetzt" | Band | Aussage |
|---|---|---|
| < 50 % | Aufbau | wesentliche Maßnahmen noch offen |
| 50–79 % | In Umsetzung | Struktur steht, Nachweise fehlen |
| 80–99 % | Zertifizierungsnah | wenige offene Punkte, Wirksamkeitsnachweise ergänzen |
| 100 % | Zertifizierungsreif | alle anwendbaren Controls umgesetzt und belegt |
Ein ISO-Auditbericht darf nicht mit „Reifegrad 2,4" argumentieren. Der Nachweis lautet „umgesetzt, hier ist der Beleg". Der Reifegrad bleibt unter ISO ein optionales Beratungsinstrument — sichtbar als Zusatzspalte, nie als Erfüllungsaussage (Entscheidung aus dem Fachgespräch, Variante 3).
7. Regressionsschutz
Die Extraktion der TisaxStrategy ist der riskanteste Teil. Absicherung vor dem Umbau:
- Snapshot erzeugen:
buildControlRowsfür den Demo-Mandanten (321 Anforderungen, 45 Controls) als JSON festhalten — Reifegradvorschlag, Zielwert, Belegstatus und offene Punkte je Control. - Nach dem Umbau vergleichen:
buildAssessment(db, tenantId, "TISAX")muss denselben Snapshot liefern. Abweichung = Regression, kein „ist besser geworden". - Als
scripts/test-framework-assessment.tsin der Hausform der übrigentest-*.tsablegen.
Ergänzend unverändert gültig: _verify.py, _verify_iso.py --lang de|en, _render_diff.py HEAD,
test-framework-dryrun.ts.
7a. Priorisierung nach Kundenlage (Nachtrag 2026-08-27)
Ist-Lage: Die Mehrzahl der Mandanten führt TISAX, ein Mandant ISO, keiner beide.
Daraus folgt zweierlei:
- Das Regressionsrisiko dominiert. Der riskanteste Teil ist nicht die ISO-Logik, sondern die
verhaltensgleiche Extraktion der
TisaxStrategy— sie betrifft alle Bestandsmandanten. Schritt 1 (Snapshot) ist damit nicht Kür, sondern die wichtigste Einzelmaßnahme des ganzen Pakets. - Zwei Themen lassen sich zurückstellen — beide betreffen ausschließlich den Doppel-Mandanten, den es heute nicht gibt:
| Zurückgestellt | Was entfällt vorerst | Wieder aufnehmen, wenn |
|---|---|---|
Schritt 7 — Vorbelegung über ISO_TO_ISA |
Übernahmevorschlag aus dem jeweils anderen Framework | ein Mandant beide Normen führt |
| Schritt 8b — Reiter-UI | Umschalter in /soa und /audit-readiness; bei einem aktiven Framework wird direkt angezeigt |
ein Mandant beide Normen führt |
Was dabei nicht zurückgestellt werden darf: die Strategie-Schnittstelle und der
Framework-Parameter in buildAssessment. Beide kosten jetzt fast nichts und sind später teuer
nachzurüsten, weil sonst 7 Aufrufstellen erneut angefasst werden müssen. Die Architektur bleibt
zweigleisig, nur die Oberfläche zeigt vorerst ein Gleis.
Erwartete Wirkung auf den Aufwand: 5–8 PT → 4–6 PT.
8. Arbeitsschritte
| # | Schritt | Ergebnis |
|---|---|---|
| 1 | Snapshot-Test der heutigen TISAX-Ausgabe | Regressionsnetz steht, vor jedem Umbau |
| 2 | ControlSpec einführen, loadEvidenceResolver darauf umstellen |
Belegbasis framework-neutral, TISAX unverändert |
| 3 | _generate_iso.py erzeugt control-specs-iso.ts |
ISO-Specs aus dem Mapping, keine Zweitpflege |
| 4 | FrameworkStrategy + TisaxStrategy (reine Extraktion) |
Snapshot grün |
| 5 | IsoStrategy (Scope aus SoA, Status statt Reifegrad) |
ISO-Bewertung rechnet |
| 6 | buildAssessment(db, tenantId, framework) ersetzt buildControlRows |
7 Dateien rufen es direkt, 13 hängen an der Assessment-Logik insgesamt |
ISO_TO_ISA |
zurückgestellt — betrifft nur Doppel-Mandanten (§7a) | |
| 8a | ISO-Readiness-Bänder und framework-richtige Beschriftung | ISO-Mandant sieht ISO-Vokabular |
/soa und /audit-readiness |
zurückgestellt (§7a) | |
| 9 | ISO-Exporte: SoA + Annex-A-Gap | Managementbewertung hat ihre Eingabe |
Schritte 1–4 sind Pflicht und hängen aneinander. 5–9 sind danach teilbar.
9. Definition of Done
| Prüfung | Erwartung |
|---|---|
| Snapshot-Test TISAX | 0 Abweichungen zur Ausgabe vor dem Umbau |
| Reiner ISO-Mandant | Readiness und SoA rechnen; keine AL-, Prüfziel- oder Reifegrad-Begriffe in der Oberfläche |
| Reiner TISAX-Mandant | Verhalten und Beschriftung unverändert |
| Doppel-Mandant | zurückgestellt — Architektur trägt es, Oberfläche zeigt es noch nicht (§7a) |
| ISO-Delta | die 33 Anforderungen ohne ISA-Gegenstück sind als eigene Liste ausweisbar |
| Gate | tsc, lint, build, _verify*, _render_diff, beide Testskripte grün |
10. Aufwand und Risiken
Aufwand: 4–6 PT im vorgezogenen Umfang (§7a), 5–8 PT vollständig. Schwerpunkt liegt auf Schritt 4 (verhaltensgleiche Extraktion) und Schritt 8 (zwei Sichten statt einer), nicht auf der ISO-Logik selbst — die ist schlank.
| Risiko | Gegenmaßnahme |
|---|---|
| TISAX-Regression bei der Extraktion | Snapshot-Test vor Schritt 2 anlegen, als Merge-Gate setzen |
| Belegbasis wandert versehentlich in die Strategie | Review-Kriterium: loadEvidenceResolver darf FrameworkKey nicht kennen |
| Gemischte Kennzahlen schleichen sich in die UI | ReadinessSummary je Framework typisieren, keine Aggregation über beide |
| ISO-Scope hängt an gepflegter SoA | leere SoA → Readiness meldet „Anwendbarkeit noch nicht erklärt" statt 0 % |
| Doppelte Datenpflege beim Doppel-Mandanten | Schritt 7 ist nicht optional |
11. Was ausdrücklich nicht gebaut wird
- Kein Reiter über Richtlinien, Nachweisen, Assets, Risiken oder Aufgaben.
- Keine gemeinsame Kennzahl über beide Frameworks.
- Kein Reifegrad als ISO-Erfüllungsaussage (optionale Zusatzspalte ja, Bewertungsgrundlage nein).
- Keine Änderung an der VDA-ISA-Logik über die reine Extraktion hinaus.
- Kein Umbau von
readiness.ts/gap-consolidation.ts— die Rechen-Engines sind numerisch standard-agnostisch und werden von beiden Strategien gefüttert.