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.
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:
Grafik in voller Größe öffnenGrafik in voller Größe öffnen
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:
| Feld | Zweck |
|---|---|
seq | lückenlose Sequenz, eindeutig |
prev_hash | Hash des Vorgängers |
entry_hash | Hash über den eigenen Inhalt einschließlich prev_hash |
signature | Ed25519-Signatur |
key_id | verwendeter Schlüssel |
Unter /attestierung (nur ADMIN) prüfst du die Kette. Die Prüfung unterscheidet drei Fehlerbilder:
| Befund | Bedeutung |
|---|---|
HASH_MISMATCH | Ein Eintrag wurde nachträglich verändert |
CHAIN_BREAK | Ein Eintrag wurde entfernt oder eingefügt |
BAD_SIGNATURE | Der 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
- In Entwicklung und Test erzeugt die Fabrik einen ephemeren Schlüssel. In den Profilen
container/prodist „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_BREAKauf. 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):
| Ereignis | Was es festhält |
|---|---|
RUN_CREATED, RUN_STARTED, RUN_PAUSED, RUN_CANCELLED | Lebenszyklus eines Runs |
RUN_MODELL_AUFGELOEST | gewähltes Modell mit Quelle (override, team, rollen-default, adapter-default) |
RUN_GUARDRAILS_ANGEWENDET | Version der Engineering-Guardrails (SHA-256-Kurzhash des Inhalts) |
RUN_POLICY_ANGEWENDET / RUN_POLICY_DENIED | angewendete Policy-Version bzw. Ablehnung mit Grund |
QUALITY_GATE_EVALUATED | Ergebnis des Quality Gates |
SBOM_ERZEUGT, ARTEFAKT_SIGNIERT | Lieferketten-Nachweis |
POLICY_AS_CODE_PUBLISHED, COMPLIANCE_PROFILE_APPLIED | Änderungen an den Regeln |
SPEC_APPROVED | Freigabe einer Spec-Fassung mit spec;version;hash |
RUN_SPEC_GEBUNDEN | die 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.
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:
| Feld | Bedeutung |
|---|---|
erlaubteAdapter | Vendor-Beschränkung (leer = keine Einschränkung) |
gateModus | off / advisory / blocking |
pflichtFreigabePhasen | z. B. EXECUTION, VALIDATION |
pflichtAttestierung | Signaturpflicht |
erlaubtePlugins | freigeschaltete Claude-Code-Plugins (leer = keine) |
mcpStandardverbot | Agent-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.
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:
- Vor der Ausführung: Darf der Agent mit diesem Auftrag, diesem Modell und diesen Rechten überhaupt loslegen?
- 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
| Freigabepunkt | Wirkung |
|---|---|
vor EXECUTION | Der 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 PhaseEXECUTION. Die Freigabe vor dem Merge verlangst du über eine Approval-Policy unter/policiesoder die Pflichtfreigabe-PhaseVALIDATIONin Policy-as-Code; die Profile BAIT/MaRisk/DORA und BSI/VS-NfD setzen sie.run.approval-segregationaktiviert Segregation of Duties: Wer den Run ausgelöst hat (run.triggered_by), darf ihn nicht selbst freigeben.- Freigeben darf ab Rolle
MAINTAINER. Das Rollenmodell lautetVIEWER < DEVELOPER < MAINTAINER < OWNER < ADMIN. Die Spec-Freigabe verlangt dieselbe Stufe. - Jede Entscheidung wird als
approval_decisionund 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.
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.
| Profil | Gate | Pflichtfreigaben | Attestierung | MCP-Standardverbot |
|---|---|---|---|---|
| Baseline | advisory | — | nein | nein |
| EU AI Act | blocking | EXECUTION | ja | nein |
| BAIT / MaRisk / DORA | blocking | EXECUTION, VALIDATION | ja | ja |
| BSI-Grundschutz / VS-NfD | blocking | EXECUTION, VALIDATION | ja | ja |
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.
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]
docs/verifier.md. --bekannt übergibt einen früher gesehenen Kettenstand.| Exit-Code | Bedeutung |
|---|---|
| 0 | Bewiesen: Kette, Signaturen und Run-Nachweis gegen die vertrauten Schlüssel belegt |
| 1 | Verletzung: verändert, unvollständig, fremd signiert oder widersprüchlich |
| 2 | Keine Verletzung, aber nicht alles beweisbar, etwa ohne --schluessel oder bei unsignierten Einträgen |
| 3 | Aufruffehler |
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
- Ein Prüfer fragt nach einer konkreten Änderung.
- Du suchst den Run; der Warum-Trace zeigt Modell, Regel, Freigabe und gegebenenfalls die Spec-Fassung.
- Unter
/exporterzeugst du das Bundle. - Der Admin übermittelt den Fingerabdruck von
/attestierungauf einem zweiten Weg. - Der Prüfer führt den Verifier aus. Exit 0 heißt bewiesen.
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_APPROVEDmitspec;version;hashin die Kette; freigegebene Fassungen sind unveränderlich. - Im Spec-Modus
STRENGeines 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 kommtRUN_POLICY_DENIEDbzw. ein Ablehnungseintrag mit Grund. Die Policy gewinnt auch dann, wenn das Projekt im Spec-ModusAUSsteht: 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 Reviewerspec-conformance. Für Runs ohne Spec-Bezug greift das Feld nicht; dafür istpflichtSpecFreigabezuständig.- Profile: EU_AI_ACT und BAIT_MARISK_DORA setzen
pflichtSpecFreigabe = true. - Audit-Export Schema 2.1: Unter
nachweis.specVersionenstehen 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_GEBUNDENgegen 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/kennzahlenleitet 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.
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.
- Richte den Attestierungsschlüssel ein und notiere, wo er gesichert wird. Prüfe unter
/attestierungdie Kette und notiere den Fingerabdruck. - Wähle unter
/compliance-profileein passendes Profil. Begründe die Wahl und notiere, welche Folgen sie für Adapter (Canary) und Freigaben hat. - Sorge für eine Freigabe vor dem Merge (Approval-Policy oder ein Profil mit Pflichtfreigabe
VALIDATION) und schalterun.approval-segregationein. Prüfe, ob mindestens zwei Personen mit MAINTAINER-Rolle existieren. - 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. - Erzeuge unter
/exportden 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? - 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
-
Welche drei Eigenschaften braucht ein Nachweis, und welcher technische Baustein sorgt jeweils dafür?
Musterantwort
Vollständig (lückenlose Sequenz
seqund Verkettung überprev_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 mitkey_id, geprüft gegen einen auf zweitem Weg übermittelten Fingerabdruck). -
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.
-
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
/attestierungauf einem zweiten Weg, und der Verifier liefert ohne--schluesselnie Exit 0. -
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.
-
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. -
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.
-
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.
-
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
--schluesselfehlt oder Einträge unsigniert bzw. Legacy sind. Mit dem auf zweitem Weg bestätigten Fingerabdruck als--schluesselund aktiver Signatur für die betroffenen Einträge ist Exit 0 erreichbar. Legacy-Einträge vor der Attestierung bleiben nicht prüfbar. -
Im Zielzustand nach SPEC-005: Eine Policy verlangt
pflichtSpecFreigabe, das Projekt steht aber im Spec-ModusAUS. 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_DENIEDin der Audit-Kette. Abhilfe: Spec-Modus einschalten, eine Spec anlegen und freigeben lassen und den Build aus einem Backlog-Eintrag mit Spec-Bezug starten. -
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>undImplements: AC-…. Über den Run findest du im Warum-Trace Spec-ID, gebundene Version, Inhalts-Hash und AC-IDs ausRUN_SPEC_GEBUNDEN, dazuSPEC_APPROVEDmit 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.