Siegel ueber null Blaettern meldet nicht mehr "intakt"

Ein Bestandssiegel, das zum Zeitpunkt des Siegelns keinen Altbestand
vorfand, ist rechnerisch tadellos und schuetzt nichts. Gemeldet wurde
trotzdem "intakt" - formal richtig, aber es liest sich als
Schutzzusage. Der Pentester hat Stagings Leersiegel genau so
missverstanden und hielt es fuer zahnhaltig.

Das ist der rote Faden im Kleinen: ein Signal, das beruhigt, wo nichts
abgesichert ist. Deshalb ein eigener Zustand "leer" mit eigenem Text -
gewertet wie "nicht_noetig", kippt `valid` also nicht, sagt aber auch
nichts zu.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-26 17:05:24 +02:00
co-authored by Claude Opus 5
parent 23505afc05
commit 909e523634
5 changed files with 35 additions and 3 deletions
+14 -2
View File
@@ -914,7 +914,7 @@ export async function verifyIntegrity(fromId?: number, toId?: number): Promise<{
* `kein_siegel` = nie erstellt. `entfernt` = Blaetter vorhanden, aber kein
* gueltiger Marker mehr – der Anker wurde herausgeloest (Pentest R174-01).
*/
backlogSealStatus: 'kein_siegel' | 'intakt' | 'gebrochen' | 'entfernt' | 'nicht_noetig';
backlogSealStatus: 'kein_siegel' | 'intakt' | 'leer' | 'gebrochen' | 'entfernt' | 'nicht_noetig';
/** Altbestands-Zeilen, deren Inhalt vom Siegel abweicht. */
backlogTampered: number[];
/** Gesiegelte Zeilen, die nicht mehr existieren – Beweismaterial entfernt. */
@@ -1061,7 +1061,7 @@ export async function verifyIntegrity(fromId?: number, toId?: number): Promise<{
const backlogMissing: number[] = [];
// Luecken, die das Siegel als bereits vorhanden beglaubigt (siehe unten).
const beglaubigteLuecken = new Set<number>();
let backlogSealStatus: 'kein_siegel' | 'intakt' | 'gebrochen' | 'entfernt' | 'nicht_noetig' = 'kein_siegel';
let backlogSealStatus: 'kein_siegel' | 'intakt' | 'leer' | 'gebrochen' | 'entfernt' | 'nicht_noetig' = 'kein_siegel';
let backlogSealRoot: string | null = null;
const siegelKandidaten = await prisma.auditLog.findMany({
@@ -1164,6 +1164,17 @@ export async function verifyIntegrity(fromId?: number, toId?: number): Promise<{
? 'intakt'
: 'gebrochen';
// Ein Siegel ueber NULL Blaettern ist rechnerisch tadellos und schuetzt
// nichts: es gab zum Zeitpunkt des Siegelns keinen Altbestand. „intakt“
// zu melden waere formal richtig und trotzdem irrefuehrend - es liest
// sich als Schutzzusage. Der Pentester hat Stagings Leersiegel genau so
// missverstanden, und das ist der rote Faden im Kleinen: ein Signal, das
// beruhigt, wo nichts abgesichert ist. Eigener Zustand, gleiche Wertung
// wie „nicht noetig“ - kein Befund, aber auch keine Zusage.
if (backlogSealStatus === 'intakt' && blaetter.length === 0) {
backlogSealStatus = 'leer';
}
// ---------------------------------------------------------------
// Beglaubigte Alt-Luecken
//
@@ -1325,6 +1336,7 @@ export async function verifyIntegrity(fromId?: number, toId?: number): Promise<{
// unsichtbar (R174-01).
const siegelInOrdnung =
backlogSealStatus === 'intakt' ||
backlogSealStatus === 'leer' ||
backlogSealStatus === 'kein_siegel' ||
backlogSealStatus === 'nicht_noetig';