Academy · Kapitel 9 von 11 · ~55 Minuten

Nicht glauben, nachweisen.

Wenn ein Agent Code schreibt, stellt jemand später die Frage: Wer hat das veranlasst, nach welchen Regeln, mit welchem Modell, und wer hat es freigegeben? Dieses Kapitel erklärt die Grundlagen manipulationssicherer Nachweise und regelbasierter Steuerung und zeigt, wie du sie in der Fabrik einrichtest, prüfst und an Dritte übergibst.

~55 Min Audit-Kette · Policy · Verifier für Leads, Admins und Prüfer

Lernziele

Nach diesem Kapitel kannst du:

  • begründen, warum Nachvollziehbarkeit bei agentischer Entwicklung keine Bürokratie ist, sondern Voraussetzung für Haftung, Audit, Regulatorik und Reproduzierbarkeit.
  • erklären, wie eine Hash-Kette und eine digitale Signatur Manipulationen sichtbar machen, und was sie nicht leisten.
  • Policy-as-Code, menschliche Aufsicht und Segregation of Duties als Steuerungsprinzipien einordnen.
  • in der Fabrik die Audit-Kette prüfen, einen Warum-Trace lesen, eine Policy veröffentlichen und ein Compliance-Profil anwenden.
  • einen Audit-Export erzeugen und mit dem Offline-Verifier unabhängig prüfen lassen.
  • beschreiben, wie Specs in die Governance eingebunden werden: Spec-Freigabe als Pflicht, Mindestabdeckung der Akzeptanzkriterien, Spec-Fassungen im Export.

9.1 Warum Nachvollziehbarkeit?

In klassischer Entwicklung beantwortet die Git-Historie viele Fragen: Wer hat was wann geändert? Bei agentischer Entwicklung reicht das nicht mehr. Der Commit-Autor ist ein Agent oder eine neutrale Identität, und die interessanten Fragen liegen davor: Wer hat den Auftrag erteilt? Welches Modell hat gearbeitet? Welche Regeln galten? Wurde der Code geprüft, und wer hat ihn freigegeben? Gegen welche Anforderung wurde gebaut?

Vier Gründe machen diese Fragen dringend:

  • Verantwortung und Haftung: Ein Agent kann keine Verantwortung tragen. Verantwortlich bleiben Menschen und Organisationen. Damit Verantwortung zuordenbar ist, muss festgehalten sein, wer welche Entscheidung getroffen hat.
  • Audit und Revision: Interne Revision, externe Prüfer und Kunden fragen nach Nachweisen. Eine Behauptung („unser Code wird immer geprüft“) ist kein Nachweis. Ein Nachweis ist ein Datensatz, den man unabhängig prüfen kann.
  • Regulatorik: Verschiedene Regelwerke verlangen Aufzeichnungen, menschliche Aufsicht und die Beherrschung von IKT- und Drittparteienrisiken. Welche Pflichten konkret für deine Organisation gelten, ist eine rechtliche Frage. Technisch lässt sich aber vorbereiten, dass die nötigen Aufzeichnungen entstehen und belastbar sind.
  • Reproduzierbarkeit und Fehleranalyse: Wenn ein Fehler auftaucht, willst du wissen, unter welchen Bedingungen der Code entstand: Modell, Kontext, Regeln, Prüfergebnisse. Erst dann kannst du die Ursache finden und den Prozess verbessern.
Merksatz: Ein Protokoll, das der Protokollierte nachträglich ändern kann, ist eine Erzählung. Ein Nachweis braucht drei Eigenschaften: vollständig (nichts fehlt), unverändert (nichts wurde umgeschrieben) und zurechenbar (es ist klar, wer ihn erzeugt hat).

9.2 Hash-Ketten und Signaturen in fünf Minuten

Hashfunktionen

Eine kryptografische Hashfunktion wie SHA-256 bildet beliebige Daten auf einen Wert fester Länge ab. Ändert sich auch nur ein Zeichen der Eingabe, ändert sich der Hash vollständig. Und es ist praktisch unmöglich, zwei verschiedene Eingaben mit demselben Hash zu finden. Ein Hash ist damit ein Fingerabdruck des Inhalts.

Verkettung

In einer Hash-Kette enthält jeder Eintrag den Hash seines Vorgängers. Der Hash eines Eintrags wird über seinen Inhalt und den Vorgänger-Hash gebildet:

Drei verkettete Audit-Einträge: Eintrag 1 (Run gestartet, prev = GENESIS, hash = H1), Eintrag 2 (Modell gewählt, prev = H1, hash = H2), Eintrag 3 (Freigabe, prev = H2, hash = H3); gesichert durch SHA-256, Vorgänger-Hash und Ed25519-Signatur. Drei verkettete Audit-Einträge: Eintrag 1 (Run gestartet, prev = GENESIS, hash = H1), Eintrag 2 (Modell gewählt, prev = H1, hash = H2), Eintrag 3 (Freigabe, prev = H2, hash = H3); gesichert durch SHA-256, Vorgänger-Hash und Ed25519-Signatur.

Grafik in voller Größe öffnenGrafik in voller Größe öffnen

Jeder Hash wird als SHA256(Inhalt + Vorgänger-Hash) gebildet, beim ersten Eintrag mit GENESIS als Vorgänger. Vereinfachtes Schema einer Hash-Kette. Wer Eintrag 2 ändert, verändert H2, und Eintrag 3 zeigt dann auf einen Hash, den es nicht mehr gibt.

Damit fällt jede Änderung, jedes Löschen, jedes Einfügen und jedes Umordnen innerhalb der Kette auf, zumindest für jemanden, der sie nachrechnet. Nicht erkennbar ist allein das Abschneiden der jüngsten Einträge am Ende; dagegen helfen ein signierter Ketten-Kopf und ein bekannter Vergleichsstand (Abschnitt 9.7). Eine fortlaufende Sequenznummer macht Lücken zusätzlich sichtbar.

Signaturen

Eine Hash-Kette allein schützt nicht gegen jemanden, der alle Hashes neu berechnet. Deshalb wird jeder Eintrag zusätzlich digital signiert: Mit einem privaten Schlüssel entsteht eine Signatur, die jeder mit dem zugehörigen öffentlichen Schlüssel prüfen kann. Ohne den privaten Schlüssel lässt sich keine gültige Signatur erzeugen. Ein verbreitetes, modernes Verfahren ist Ed25519.

Was das nicht leistet

  • Wer den privaten Schlüssel besitzt, kann gültig signieren, auch Falsches. Schlüsselschutz ist deshalb Teil des Nachweises.
  • Wer den öffentlichen Schlüssel aus derselben Quelle bezieht wie die Daten, prüft nichts: Ein Fälscher tauscht beides aus. Der Vertrauensanker muss auf einem zweiten Weg kommen.
  • Eine Kette belegt, dass Einträge seit ihrer Entstehung unverändert sind. Sie belegt nicht, dass das System, das sie schrieb, die Wahrheit aufgeschrieben hat.

In der Fabrik

Die signierte Audit-Kette unter /attestierung

Jedes Audit-Ereignis der Fabrik trägt die Felder einer signierten Hash-Kette:

FeldZweck
seqlückenlose Sequenz, eindeutig
prev_hashHash des Vorgängers
entry_hashHash über den eigenen Inhalt einschließlich prev_hash
signatureEd25519-Signatur
key_idverwendeter Schlüssel

Unter /attestierung (nur ADMIN) prüfst du die Kette. Die Prüfung unterscheidet drei Fehlerbilder:

BefundBedeutung
HASH_MISMATCHEin Eintrag wurde nachträglich verändert
CHAIN_BREAKEin Eintrag wurde entfernt oder eingefügt
BAD_SIGNATUREDer Eintrag stammt nicht vom erwarteten Schlüssel

Altbestand ohne Signatur wird transparent als solcher ausgewiesen, statt die Prüfung scheitern zu lassen. Auf derselben Seite findest du den Fingerabdruck des Signaturschlüssels als Vertrauensanker für den Offline-Verifier.

Den Schlüssel einrichten

SOFTWAREFABRIK_ATTESTATION_SIGNING_ENABLED=true
SOFTWAREFABRIK_ATTESTATION_KEY_ID=<sprechende-id>
SOFTWAREFABRIK_ATTESTATION_PRIVATE_KEY=/pfad/zum/ed25519-key.pem
# optional: SOFTWAREFABRIK_ATTESTATION_KEYRING_PATH für Schlüsselwechsel
Attestierungsschlüssel laut Administrationshandbuch, Abschnitt 2.2.
  • In Entwicklung und Test erzeugt die Fabrik einen ephemeren Schlüssel. In den Profilen container/prod ist „aktiviert ohne Schlüssel“ ein Startfehler. Wer ohne Signatur betreiben will, muss das explizit erklären (…SIGNING_ENABLED=false). Sicherheit soll eine Entscheidung sein, kein Versehen.
  • Der Schlüssel gehört ins Backup. Ohne ihn lässt sich die Kette später nicht mehr verifizieren. Nach einem Schlüsselwechsel stellst du den alten Schlüssel über den Keyring-Pfad weiter bereit, sonst meldet die Prüfung für Alt-Einträge BAD_SIGNATURE.
  • Führe die Kettenprüfung nach jedem Restore und regelmäßig aus. Ein unvollständiges Backup fällt dabei als CHAIN_BREAK auf. Die Nachweisstruktur ist damit zugleich eine Integritätsprüfung deiner Sicherung.

9.3 Was aufzeichnen? Entscheidungen, nicht nur Ergebnisse

Ein gutes Audit-Protokoll für agentische Entwicklung zeichnet nicht jeden Tastendruck auf, sondern die entscheidungsrelevanten Ereignisse: Auftrag, Regeln, Ressourcen, Prüfungen, Freigaben. Hilfreich ist die Frage, welche Information ein Prüfer in einem Jahr bräuchte, um einen konkreten Code-Stand zu erklären.

  • Lebenszyklus: angelegt, gestartet, pausiert, abgebrochen.
  • Konfiguration zur Laufzeit: welches Modell, aus welcher Quelle, welche Verhaltensregeln in welcher Version.
  • Regeln: welche Policy angewendet wurde und welche Läufe abgelehnt wurden. Auch die Ablehnung ist ein Nachweis.
  • Prüfungen: Gate-Ergebnis, SBOM, Signaturen von Artefakten.
  • Menschliche Entscheidungen: Freigaben mit Person und Zeitpunkt.
  • Anforderungsbezug: gegen welche Anforderung in welcher Fassung gebaut wurde.

Ein zweiter Grundsatz: Inhalte nur dort, wo nötig. Werkzeugargumente können vertrauliche Daten enthalten. Oft genügt ein Hash, um später zu beweisen, dass und was übergeben wurde, ohne den Inhalt im Protokoll zu speichern.

In der Fabrik

Attestierte Ereignisse und der Warum-Trace

Die Fabrik schreibt unter anderem diese Ereignisse in die signierte Kette (Auswahl, siehe docs/governance-compliance.md und Administrationshandbuch):

EreignisWas es festhält
RUN_CREATED, RUN_STARTED, RUN_PAUSED, RUN_CANCELLEDLebenszyklus eines Runs
RUN_MODELL_AUFGELOESTgewähltes Modell mit Quelle (override, team, rollen-default, adapter-default)
RUN_GUARDRAILS_ANGEWENDETVersion der Engineering-Guardrails (SHA-256-Kurzhash des Inhalts)
RUN_POLICY_ANGEWENDET / RUN_POLICY_DENIEDangewendete Policy-Version bzw. Ablehnung mit Grund
QUALITY_GATE_EVALUATEDErgebnis des Quality Gates
SBOM_ERZEUGT, ARTEFAKT_SIGNIERTLieferketten-Nachweis
POLICY_AS_CODE_PUBLISHED, COMPLIANCE_PROFILE_APPLIEDÄnderungen an den Regeln
SPEC_APPROVEDFreigabe einer Spec-Fassung mit spec;version;hash
RUN_SPEC_GEBUNDENdie beim Run-Start gebundene Spec-Fassung mit spec=…;version=N;hash=…;ac=…
MCP_TOOL_AUFRUF u. a.Aufrufe über das MCP-Gateway mit Hashes statt Inhalten (siehe Kapitel 8)

Der Warum-Trace

Die Kette ist vollständig, aber für Menschen schwer lesbar. Der Warum-Trace unter /runs/{id}/trace beantwortet für einen einzelnen Run die Frage, warum der Code so entstanden ist. Er korreliert:

  • Run und Metriken: Modell, Kosten, Dauer. Im Claude-Abo-Modus sind Kosten als „Schätzung (API-Tarif), nicht abgerechnet“ gekennzeichnet.
  • Plan-Herkunft: aus welchem Plan-Run und Backlog-Eintrag der Build-Run stammt.
  • Freigabeentscheidungen und Akteure.
  • verwendete Prompts und Artefakte.
  • die attestierten Audit-Ereignisse, darunter Policy-Version, Guardrails-Version und Gate-Ergebnis.
  • bei Runs mit Spec-Bezug: Spec-ID, gebundene Version, Inhalts-Hash und AC-IDs aus RUN_SPEC_GEBUNDEN. Ohne Spec-Bezug bleibt der Trace unverändert.
  • bei Child Runs eines Workflows: den Workflow-Kontext.
Vier Fragen des Nachweises: Auftrag (was sollte entstehen?), Policy (welche Regeln galten?), Run und Modell (was wurde ausgeführt?), Gate und Freigabe (wer hat geprüft?). Vier Fragen des Nachweises: Auftrag (was sollte entstehen?), Policy (welche Regeln galten?), Run und Modell (was wurde ausgeführt?), Gate und Freigabe (wer hat geprüft?).

Grafik in voller Größe öffnenGrafik in voller Größe öffnen

Der Trace ist mandantengeschützt: Du siehst nur Runs deines Mandanten. Wie Spec-Bindung und Commit-Trailer im Detail funktionieren, erklärt Kapitel 4.

9.4 Policy-as-Code: Regeln als Dokument

Regeln wie „nur diese Anbieter“, „Quality Gate blockierend“ oder „Freigabe vor Ausführung“ lassen sich auf zwei Arten verwalten: als verstreute Einstellungen in einer Oberfläche oder als Policy-as-Code, also als ein strukturiertes Dokument, das versioniert, geprüft und nachgewiesen wird.

Die Vorteile des zweiten Wegs:

  • Versioniert: Jede Änderung erzeugt eine neue Fassung; die alte bleibt erhalten. Man kann jederzeit sagen, welche Regeln zu einem Zeitpunkt galten.
  • Signiert: Eine signierte Fassung lässt sich nicht unbemerkt ändern.
  • Eindeutig wirksam: Es gibt genau eine aktive Fassung, keine Mischzustände.
  • Durchgesetzt statt empfohlen: Das System prüft die Regeln an definierten Punkten und lehnt Verstöße ab.
  • Schichtbar: Eine engere Ebene (etwa ein Mandant) darf Regeln verschärfen, aber nicht lockern.

Ein wichtiger Detailpunkt ist der Zeitpunkt der Durchsetzung. Prüft ein System nur beim Anlegen eines Auftrags, kann ein Auftrag, der vor einer Regeländerung angelegt wurde, die neue Regel umgehen. Robuster ist eine zweite Prüfung unmittelbar vor der Ausführung.

In der Fabrik

Policy-as-Code unter /policy-as-code

Die Seite /policy-as-code ist nur für ADMIN zugänglich. Eine Policy enthält diese Felder:

FeldBedeutung
erlaubteAdapterVendor-Beschränkung (leer = keine Einschränkung)
gateModusoff / advisory / blocking
pflichtFreigabePhasenz. B. EXECUTION, VALIDATION
pflichtAttestierungSignaturpflicht
erlaubtePluginsfreigeschaltete Claude-Code-Plugins (leer = keine)
mcpStandardverbotAgent-CLIs nur mit Isolationsnachweis
erlaubteMcpServerüber das MCP-Gateway erreichbare Server samt Pins (leer = keine)
pflichtSpecFreigabe (Zielzustand SPEC-005)Build-Runs und Workflow-Planfreigaben nur mit Bezug auf eine freigegebene Spec (Default aus)
minAcAbdeckung (Zielzustand SPEC-005)Mindestanteil der gebundenen Akzeptanzkriterien, die durch Tests belegt sein müssen (Anteil 0 bis 1, Default leer)

Ablauf: Inhalt bearbeiten → Veröffentlichen (erzeugt eine neue Ed25519-signierte Version und deaktiviert die vorherige, Ereignis POLICY_AS_CODE_PUBLISHED) → Verifizieren prüft die Signatur.

  • Genau eine aktive Version je Mandant, technisch erzwungen.
  • Zweifache Durchsetzung: beim Anlegen eines Runs und erneut zur Ausführungszeit. Warum-Trace und Export weisen damit die tatsächlich durchgesetzte Version aus.
  • Globaler Policy-Floor: Eine Mandanten-Policy kann die globale nur verschärfen, nicht unterlaufen. Bei erlaubten Plugins und MCP-Servern gilt die Schnittmenge.
  • Abgelehnte Läufe erzeugen RUN_POLICY_DENIED. Siehst du diese Ablehnung als Nutzer, prüfst du gemeinsam mit dem Admin, ob der Adapter von der aktiven Policy erlaubt ist.
Neue Felder, alte Signaturen: Neue Policy-Felder erscheinen in der kanonischen, signierten Form nur, wenn sie vom Default abweichen. Bestehende signierte Policy-Dokumente bleiben dadurch gültig. So ist es für mcpStandardverbot umgesetzt (ADR-0017), und SPEC-005 sieht es für pflichtSpecFreigabe und minAcAbdeckung ebenso vor.

Daneben gibt es unter /policies die Approval-Policies für einzelne Freigabepunkte, und auf Projektebene die Modell-Policy (/projects/{id} → Modell-Policy), also die erlaubten Adapter je Projekt; sie wird beim Anlegen eines Runs erzwungen, ein Verstoß erzeugt RUN_POLICY_DENIED. Welches Modell tatsächlich gewählt wurde und warum, hält RUN_MODELL_AUFGELOEST fest.

9.5 Menschliche Aufsicht und Segregation of Duties

Menschliche Aufsicht heißt nicht, dass ein Mensch jede Zeile tippt, sondern dass an den entscheidenden Stellen ein Mensch zustimmen muss und diese Zustimmung dokumentiert ist. Für agentische Entwicklung gibt es zwei natürliche Haltepunkte:

  1. Vor der Ausführung: Darf der Agent mit diesem Auftrag, diesem Modell und diesen Rechten überhaupt loslegen?
  2. Vor der Übernahme: Darf das geprüfte Ergebnis in den gemeinsamen Stand, also gemergt oder als Pull Request eröffnet werden?

Der zweite Punkt ist entscheidend. Fehlt er, landet der Code im Base-Branch, bevor jemand ihn gesehen hat. Eine nachträgliche „Freigabe“ wäre dann nur Fassade.

Segregation of Duties (Funktionstrennung) bedeutet, dass dieselbe Person nicht zugleich auslösen und freigeben darf. Das klassische Vier-Augen-Prinzip schützt vor Fehlern und vor Missbrauch. Bei Agenten gilt es zusätzlich in einer zweiten Form: Der schreibende Agent darf seine Arbeit nicht selbst freigeben. Diese Rolle übernehmen unabhängige, read-only Reviewer und ein Mensch.

Ein drittes Prinzip ist fail-closed: Wenn eine Prüfung nicht durchgeführt werden kann, etwa weil ein Reviewer abstürzt oder eine Policy nicht lesbar ist, darf das nie als Erfolg gelten.

In der Fabrik

Zwei Freigabepunkte, Rollen und Funktionstrennung

FreigabepunktWirkung
vor EXECUTIONDer Agent läuft erst nach Freigabe; der Run steht in WAITING_FOR_APPROVAL. Ohne aktive Approval-Policy ist das der Default (run.approval-vor-merge, an)
vor dem Merge (in VALIDATION)Der validierte Stand wird erst nach Freigabe gemergt bzw. als PR eröffnet; der Inline-Diff auf der Detailseite zeigt jetzt die Änderungen des Agenten. Aktiv über eine Approval-Policy oder pflichtFreigabePhasen mit VALIDATION
  • run.approval-vor-merge (Default an) lässt jeden Run ohne aktive Approval-Policy vor der Ausführung auf Freigabe warten; trotz des Namens betrifft es die Phase EXECUTION. Die Freigabe vor dem Merge verlangst du über eine Approval-Policy unter /policies oder die Pflichtfreigabe-Phase VALIDATION in Policy-as-Code; die Profile BAIT/MaRisk/DORA und BSI/VS-NfD setzen sie.
  • run.approval-segregation aktiviert Segregation of Duties: Wer den Run ausgelöst hat (run.triggered_by), darf ihn nicht selbst freigeben.
  • Freigeben darf ab Rolle MAINTAINER. Das Rollenmodell lautet VIEWER < DEVELOPER < MAINTAINER < OWNER < ADMIN. Die Spec-Freigabe verlangt dieselbe Stufe.
  • Jede Entscheidung wird als approval_decision und als attestiertes Ereignis festgehalten. Optional erfasst du bei der Freigabe deinen Aufwand in Minuten; das Feld ist eine freiwillige Selbstauskunft und fließt getrennt von abgeleiteten Werten in die Kennzahlen ein.
  • Ein abgestürzter Reviewer führt zu ERROR, nie zu einem stillen Pass.
Typische Stolperfalle: Ein Run hängt in WAITING_FOR_APPROVAL, weil nur eine Person mit MAINTAINER-Rolle im Team ist und Segregation of Duties sie als Auslöserin ausschließt. Plane in regulierten Teams mindestens zwei freigabeberechtigte Personen ein.

9.6 Regulatorik: Was Technik leisten kann und was nicht

Viele Organisationen müssen nachweisen, dass sie Risiken beim Einsatz von Software und KI beherrschen. Einige Beispiele, ohne Anspruch auf Vollständigkeit und ohne Rechtsberatung:

  • Die EU-KI-Verordnung (VO (EU) 2024/1689) enthält unter anderem Vorgaben zu Aufzeichnungen (Art. 12) und menschlicher Aufsicht (Art. 14) für bestimmte KI-Systeme.
  • Im Finanzsektor beschreiben die MaRisk der BaFin, die BAIT (deren Anforderungen sich für DORA-pflichtige Institute mit DORA überschneiden; maßgeblich ist die jeweils aktuelle Aufsichtspraxis) und der Digital Operational Resilience Act (DORA, VO (EU) 2022/2554) Anforderungen an IKT-Risikomanagement, Drittparteienrisiken und Nachweisführung.
  • Für die öffentliche Hand sind BSI IT-Grundschutz und die Regeln für Verschlusssachen (VS-NfD) relevant.

Ob und wie diese Regelwerke auf deinen Einsatz anwendbar sind, klären Fachleute für Recht und Compliance. Technik kann zweierlei beitragen: Sie kann die technisch erzwingbaren Anteile durchsetzen (Freigaben, Signaturpflicht, blockierende Prüfungen, Anbieterbeschränkung) und die nötigen Aufzeichnungen manipulationssicher erzeugen. Organisatorische Pflichten wie Verantwortlichkeiten, Schulungen, Risikoanalysen und Verträge mit Anbietern ersetzt sie nicht.

In der Fabrik

Compliance-Profile unter /compliance-profile

Ein Compliance-Profil ist eine vorbereitete Policy. Anwenden heißt: Die Fabrik veröffentlicht eine passende signierte Policy-Version und schreibt COMPLIANCE_PROFILE_APPLIED in die Kette. Die Seite ist nur für ADMIN zugänglich.

ProfilGatePflichtfreigabenAttestierungMCP-Standardverbot
Baselineadvisory—neinnein
EU AI ActblockingEXECUTIONjanein
BAIT / MaRisk / DORAblockingEXECUTION, VALIDATIONjaja
BSI-Grundschutz / VS-NfDblockingEXECUTION, VALIDATIONjaja

Im Zielzustand nach SPEC-005 setzen die Profile EU AI Act und BAIT/MaRisk/DORA zusätzlich pflichtSpecFreigabe = true; Baseline und BSI/VS-NfD bleiben unverändert.

Ehrliche Einordnung (Administrationshandbuch, Abschnitt 8): Die Profile setzen die technisch erzwingbaren Anteile durch. Sie ersetzen keine Rechtsberatung und decken keine organisatorischen Pflichten ab. Für VS-NfD ist zusätzlich die Adapterwahl projektspezifisch auf lokale bzw. souveräne Backends zu beschränken; regionale Datenhaltung wird über die Gateway-Konfiguration durchgesetzt, nicht über das Profil. Wo maximale Trennung gefordert ist, bleibt eine Instanz je Mandant die konservativste Variante.

Denke daran: Profile mit MCP-Standardverbot sperren alle Agent-CLIs, bis ein Canary-Isolationsnachweis vorliegt (Kapitel 8). Plane den Canary-Lauf vor dem Umschalten ein.

9.7 Unabhängige Prüfung: Nachweise nach außen geben

Ein Nachweis ist erst dann stark, wenn ihn jemand prüfen kann, der dem System nicht vertraut. Daraus folgen Anforderungen an einen Export:

  • Deterministisch: Dieselben Daten ergeben dieselben Bytes, unabhängig von Bibliotheksversionen. Sonst lässt sich ein Hash nicht nachrechnen.
  • Selbsttragend: Der Export enthält alles, was zur Prüfung nötig ist, ohne Zugriff auf das Ursprungssystem.
  • Datensparsam: Einträge, die nicht zum Prüfgegenstand gehören, etwa andere Projekte oder Mandanten, erscheinen nur als Hash-Stellvertreter. Ihre Anzahl ist sichtbar, ihr Inhalt nicht.
  • Unabhängig prüfbar: Das Prüfwerkzeug stammt nicht von der geprüften Installation, ist klein, quelloffen und reproduzierbar gebaut.
  • Vertrauensanker auf zweitem Weg: Der Fingerabdruck des Signaturschlüssels kommt per Brief, Ticket oder signierter E-Mail, nicht im selben Paket wie die Daten.

In der Fabrik

Audit-Export unter /export und der Offline-Verifier

Export erzeugen

Unter /export (nur ADMIN) erzeugst du ein prüffähiges Bundle je Projekt oder Run, als JSON und als HTML. Es enthält Warum-Trace, Kettenverifikation, den geltenden Policy-Stand und den öffentlichen Schlüssel. Das Bundle ist bewusst deterministisch serialisiert: nur Strings, Primitive und UUIDs, Zeitstempel als ISO-8601.

Ab Schema 2.0 (ADR-0023) enthält der Export einen prüfbaren Nachweisteil: volle Einträge der betroffenen Runs, Hash-Stellvertreter ohne Inhalt für alle anderen Einträge bis zum signierten Ketten-Kopf, die im Run angewandten Policy-Versionen, die Schlüssel mit Fingerabdruck und ein signiertes Run-Manifest, das bezeugt, welche Ereignisse zu einem Run gehören.

Unabhängig prüfen

Den Offline-Verifier softwarefabrik-verifier.jar lädst du unter softwarefabrik.io/verifier.html herunter, nicht aus der geprüften Fabrik-Installation. Er braucht nur ein JDK ab Version 25, hat keine Laufzeitabhängigkeiten und ist reproduzierbar baubar.

java -jar softwarefabrik-verifier.jar audit-export-mein-projekt.json \
     --schluessel 3f6a…c21e \
     [--bekannt 4711:9b2d…e0f1]
Aufruf laut docs/verifier.md. --bekannt übergibt einen früher gesehenen Kettenstand.
Exit-CodeBedeutung
0Bewiesen: Kette, Signaturen und Run-Nachweis gegen die vertrauten Schlüssel belegt
1Verletzung: verändert, unvollständig, fremd signiert oder widersprüchlich
2Keine Verletzung, aber nicht alles beweisbar, etwa ohne --schluessel oder bei unsignierten Einträgen
3Aufruffehler

Ohne --schluessel endet die Prüfung nie mit 0. Felder, in denen die Fabrik über sich selbst urteilt, gelten dem Verifier nicht als Beleg; er rechnet nach.

Der typische Auditfall

  1. Ein Prüfer fragt nach einer konkreten Änderung.
  2. Du suchst den Run; der Warum-Trace zeigt Modell, Regel, Freigabe und gegebenenfalls die Spec-Fassung.
  3. Unter /export erzeugst du das Bundle.
  4. Der Admin übermittelt den Fingerabdruck von /attestierung auf einem zweiten Weg.
  5. Der Prüfer führt den Verifier aus. Exit 0 heißt bewiesen.
Grenzen (aus docs/verifier.md): Bewiesen wird die Unversehrtheit ab dem ersten exportierten Eintrag bis zum Kopf zum Exportzeitpunkt. Wer vor dem Export Datenbankzugriff hatte, könnte die neuesten Einträge löschen und den Kopf zurücksetzen; dagegen hilft --bekannt mit dem Kopf eines früheren Exports. Gegen eine Fabrik, die mit dem echten Schlüssel falsch bezeugt, hilft kein Export-Prüfer. Tool-Aufrufe der Agenten auf Dateien und Shell sind noch nicht Teil der Kette, MCP-Aufrufe über das Gateway schon.

9.8 Anforderungen unter Governance: Spec-Pflicht

Bis hierher beantwortet die Governance, wie Code entstanden ist. Eine Frage bleibt: Wurde das Richtige gebaut? Dafür braucht es freigegebene, versionierte Anforderungen. Das Konzept der Produkt-Spec mit Akzeptanzkriterien behandelt Kapitel 4. Hier geht es darum, wie Specs zum Teil der Governance werden.

Drei Bausteine greifen ineinander:

  • Pflicht: Ein Build darf nur starten, wenn er sich auf eine freigegebene Anforderung bezieht.
  • Abdeckung: Ein Ergebnis wird nur abgenommen, wenn ein Mindestanteil der gebundenen Akzeptanzkriterien durch Tests belegt ist.
  • Nachweis: Der Export enthält die Anforderungsfassung selbst, signiert und mit Freigabe, sodass ein Prüfer unabhängig nachvollziehen kann, gegen welchen Text gebaut wurde.

Dazu kommen Kennzahlen, die zeigen, ob der Prozess wirkt: Wie viele Kriterien sind durch Tests belegt? Wie oft ändern sich freigegebene Anforderungen während der Umsetzung? Wie viele Starts hatten überhaupt eine freigegebene Anforderung?

In der Fabrik

Spec-Freigabe, Policy-Pflicht, Export 2.1 und SDD-Kennzahlen

Heute (Stand v0.38.0)

  • Die Spec-Freigabe ist ein eigenes, auditiertes Gate ab Rolle MAINTAINER. Sie schreibt SPEC_APPROVED mit spec;version;hash in die Kette; freigegebene Fassungen sind unveränderlich.
  • Im Spec-Modus STRENG eines Projekts ist eine freigegebene Spec Startbedingung für die Backlog-Aktivierung und für die Planfreigabe eines Workflows mit schreibenden Tasks.
  • Runs mit Spec-Bezug binden die zum Start freigegebene Fassung als RUN_SPEC_GEBUNDEN; der Warum-Trace zeigt sie.

Zielzustand nach SPEC-005 (Governance, Tier Enterprise)

  • pflichtSpecFreigabe: Solange eine wirksame Policy es verlangt, lehnt die Fabrik den Start eines Build-Runs ohne Bezug auf eine freigegebene Spec-Fassung ab, ebenso die Planfreigabe eines Workflows mit schreibenden Tasks ohne solchen Bezug. In die Kette kommt RUN_POLICY_DENIED bzw. ein Ablehnungseintrag mit Grund. Die Policy gewinnt auch dann, wenn das Projekt im Spec-Modus AUS steht: Es gilt die strengere Regel.
  • minAcAbdeckung: Das Quality Gate blockiert einen Run, dessen Anteil durch Tests belegter gebundener Akzeptanzkriterien unter dem Wert liegt. Den Anteil liefert der Reviewer spec-conformance. Für Runs ohne Spec-Bezug greift das Feld nicht; dafür ist pflichtSpecFreigabe zuständig.
  • Profile: EU_AI_ACT und BAIT_MARISK_DORA setzen pflichtSpecFreigabe = true.
  • Audit-Export Schema 2.1: Unter nachweis.specVersionen stehen je im Geltungsbereich gebundener Spec-Fassung Inhalt, Inhalts-Hash, Signatur, Key-ID sowie die Freigabe (wer, wann). Exporte ohne Spec-Bezug bleiben inhaltlich wie bisher, und Fassungen fremder Mandanten erscheinen nicht.
  • Verifier: Er prüft Hash und Signatur jeder Spec-Fassung und gleicht jedes RUN_SPEC_GEBUNDEN gegen die gelieferten Fassungen ab. Eine manipulierte Fassung oder ein Bezug auf eine fehlende Fassung lässt die Prüfung scheitern. Exporte 2.0 bestehen weiterhin, und der bisherige Verifier akzeptiert Exporte 2.1.
  • SDD-Kennzahlen: AC-Abdeckung, Anzahl SPEC_DRIFT-Ereignisse, Anteil der Starts mit freigegebener Spec und Spec-Änderungen je Release, für Workflows und für Einzel-Runs eines Projekts. Die Kennzahlen-Seite /kennzahlen leitet ihre Werte heute schon ohne eigenes Schema aus vorhandenen Daten ab.
  • Lizenz: Policy-Pflicht, Export-Erweiterung und SDD-Kennzahlen gibt es nur bei Tier Enterprise oder ohne aktives Lizenzsystem. Bei Professional bleiben die übrigen Spec-Funktionen verfügbar.
Stand: Die Governance-Erweiterung aus SPEC-005 ist in Umsetzung. Die Beschreibung oben folgt der Spec. Prüfe vor dem produktiven Einsatz im Handbuch und im Administrationshandbuch, welche Teile in deiner Version verfügbar sind.

9.9 Zusammenfassung

  • Nachweise müssen vollständig, unverändert und zurechenbar sein. Hash-Ketten machen Änderungen sichtbar, Signaturen machen Einträge zurechenbar, und der Vertrauensanker kommt auf einem zweiten Weg.
  • Policy-as-Code macht Regeln versioniert, signiert, eindeutig wirksam und doppelt durchgesetzt.
  • Menschliche Aufsicht braucht zwei Haltepunkte (vor Ausführung, vor Merge) und Funktionstrennung.
  • Compliance-Profile setzen technisch erzwingbare Anteile durch, keine organisatorischen Pflichten.
  • Der Audit-Export mit dem Offline-Verifier erlaubt Dritten, ohne Vertrauen in die Fabrik zu prüfen.
  • Mit der Spec-Pflicht wird auch nachweisbar, gegen welche freigegebene Anforderung gebaut wurde.

Wie Kosten, Budgets, Mandanten und Rollen den Betrieb steuern, folgt in Kapitel 10.

Übung

Übung: Einen Auditfall durchspielen

Du betreibst die Fabrik für ein Team in einem regulierten Umfeld. Ziel ist eine Konfiguration, mit der du einem externen Prüfer für einen beliebigen Run nachweisen kannst, wer ihn veranlasst und freigegeben hat und welche Regeln galten.

  1. Richte den Attestierungsschlüssel ein und notiere, wo er gesichert wird. Prüfe unter /attestierung die Kette und notiere den Fingerabdruck.
  2. Wähle unter /compliance-profile ein passendes Profil. Begründe die Wahl und notiere, welche Folgen sie für Adapter (Canary) und Freigaben hat.
  3. Sorge für eine Freigabe vor dem Merge (Approval-Policy oder ein Profil mit Pflichtfreigabe VALIDATION) und schalte run.approval-segregation ein. Prüfe, ob mindestens zwei Personen mit MAINTAINER-Rolle existieren.
  4. Lasse einen Run (zum Üben gern mit dem Mock-Adapter, sofern dein Profil ihn zulässt) durchlaufen und öffne /runs/{id}/trace. Finde Modellquelle, Policy-Version, Guardrails-Version, Gate-Ergebnis und Freigeber.
  5. Erzeuge unter /export den Run-Export als JSON, lade den Verifier von verifier.html und prüfe den Export mit dem notierten Fingerabdruck. Welcher Exit-Code erscheint, und warum?
  6. Zusatz: Prüfe denselben Export einmal ohne --schluessel. Was ändert sich?
Lösungsskizze

Für ein Bankenumfeld passt BAIT/MaRisk/DORA: Gate blockierend, Pflichtfreigaben vor EXECUTION und VALIDATION, Attestierungspflicht und MCP-Standardverbot. Folge: Agent-CLIs laufen erst nach bestandenem Canary für die installierte Version; vorher nur der Mock. Der Warum-Trace zeigt RUN_MODELL_AUFGELOEST mit Quelle, RUN_POLICY_ANGEWENDET mit Version, RUN_GUARDRAILS_ANGEWENDET, QUALITY_GATE_EVALUATED und die Freigabeentscheidungen mit Akteur. Mit korrektem Fingerabdruck liefert der Verifier Exit 0, sofern alle Einträge signiert sind; ohne --schluessel höchstens Exit 2, weil dann nur die innere Konsistenz belegt ist.

Kapitelfragen

  1. Welche drei Eigenschaften braucht ein Nachweis, und welcher technische Baustein sorgt jeweils dafür?

    Musterantwort

    Vollständig (lückenlose Sequenz seq und Verkettung über prev_hash, im Export zusätzlich der signierte Kopf und das Run-Manifest), unverändert (entry_hash über Inhalt und Vorgänger) und zurechenbar (Ed25519-Signatur mit key_id, geprüft gegen einen auf zweitem Weg übermittelten Fingerabdruck).

  2. Die Kettenprüfung meldet nach einem Restore CHAIN_BREAK. Was bedeutet das, und was ist eine wahrscheinliche Ursache?

    Musterantwort

    Ein Eintrag fehlt oder wurde eingefügt; die Verkettung stimmt an einer Stelle nicht. Nach einem Restore ist ein unvollständiges Backup eine naheliegende Ursache. Genau deshalb empfiehlt das Administrationshandbuch die Kettenprüfung nach jedem Restore: Sie ist zugleich eine Integritätsprüfung der Sicherung.

  3. Warum genügt es nicht, dem Prüfer zusammen mit dem Export auch den öffentlichen Schlüssel zu schicken?

    Musterantwort

    Wer Einträge fälscht, kann auch den mitgelieferten Schlüssel austauschen und alles neu signieren. Der Vertrauensanker muss aus einer unabhängigen Quelle kommen. Deshalb übermittelt der Admin den Fingerabdruck von /attestierung auf einem zweiten Weg, und der Verifier liefert ohne --schluessel nie Exit 0.

  4. Warum setzt die Fabrik eine Policy zweimal durch, beim Anlegen und bei der Ausführung eines Runs?

    Musterantwort

    Ein Run, der vor der Aktivierung einer neuen Policy angelegt wurde, könnte sie sonst umgehen. Außerdem soll der Warum-Trace bzw. Export die tatsächlich durchgesetzte Policy-Version ausweisen. Dasselbe Muster gilt für den Isolationsnachweis: Ein CLI-Update zwischen Anlage und Start wird so erkannt.

  5. Ein Kollege schlägt vor, nur einen Freigabepunkt vor der Ausführung einzurichten, „das reicht doch“. Was entgegnest du?

    Musterantwort

    Ohne Freigabe vor dem Merge (Approval-Policy bzw. Pflichtfreigabe-Phase VALIDATION) landet der Code im Base-Branch oder im PR, bevor ein Mensch das validierte Ergebnis gesehen hat. Die Freigabe vor der Ausführung bewertet nur den Auftrag, nicht das Ergebnis. Für regulierte Profile ist der zweite Punkt entscheidend, sonst wäre die signierte Zusage Fassade.

  6. Ein Mandanten-Admin will in seiner Policy das MCP-Standardverbot abschalten, das in der globalen Policy gesetzt ist. Geht das?

    Musterantwort

    Nein. Über mehrere wirksame Policies gilt das Strengere: Eine Mandanten-Policy kann die globale nur verschärfen, nicht unterlaufen (globaler Policy-Floor). Bei Plugins und MCP-Servern gilt entsprechend die Schnittmenge.

  7. Deine Geschäftsführung fragt: „Wenn wir das Profil EU AI Act anwenden, sind wir dann konform?“ Wie antwortest du?

    Musterantwort

    Nein, nicht automatisch. Das Profil setzt die technisch erzwingbaren Anteile durch (blockierendes Gate, Pflichtfreigabe vor EXECUTION, Attestierung) und erzeugt manipulationssichere Aufzeichnungen. Es ersetzt keine Rechtsberatung und deckt keine organisatorischen Pflichten ab. Ob und welche Pflichten gelten, klären Recht und Compliance; die Fabrik liefert dafür belastbare technische Bausteine und Nachweise.

  8. Der Offline-Verifier liefert Exit 2. Was heißt das, und wie kommst du zu Exit 0?

    Musterantwort

    Es wurde keine Verletzung gefunden, aber nicht alles ist beweisbar, typischerweise weil --schluessel fehlt oder Einträge unsigniert bzw. Legacy sind. Mit dem auf zweitem Weg bestätigten Fingerabdruck als --schluessel und aktiver Signatur für die betroffenen Einträge ist Exit 0 erreichbar. Legacy-Einträge vor der Attestierung bleiben nicht prüfbar.

  9. Im Zielzustand nach SPEC-005: Eine Policy verlangt pflichtSpecFreigabe, das Projekt steht aber im Spec-Modus AUS. Was passiert beim Start eines Build-Runs?

    Musterantwort

    Die Policy gewinnt als strengere Regel. Der Start wird abgelehnt, mit verständlichem Grund und einem Eintrag RUN_POLICY_DENIED in der Audit-Kette. Abhilfe: Spec-Modus einschalten, eine Spec anlegen und freigeben lassen und den Build aus einem Backlog-Eintrag mit Spec-Bezug starten.

  10. Transfer: Ein Kunde will sechs Monate nach Lieferung wissen, gegen welche Anforderung ein bestimmter Code-Stand gebaut wurde. Welche Spuren nutzt du, und was kann der Kunde selbst prüfen?

    Musterantwort

    Der Fabrik-Commit trägt die Trailer Spec: SPEC-<nnn> und Implements: AC-…. Über den Run findest du im Warum-Trace Spec-ID, gebundene Version, Inhalts-Hash und AC-IDs aus RUN_SPEC_GEBUNDEN, dazu SPEC_APPROVED mit der Freigabe. Selbst prüfen kann der Kunde den Run-Export mit dem Offline-Verifier; im Zielzustand nach SPEC-005 enthält der Export 2.1 die Spec-Fassung samt Signatur und Freigabe, und der Verifier gleicht die Bindung gegen die gelieferte Fassung ab.