Neuberechnung der Kette als eigene Gegenbuch-Alarmbedingung (R186 Frage b)

Der Tester fragte praezise: Loest cleanup -> rehash OHNE erneutes Siegeln,
ueber NICHT versiegelten Inhalt, etwas Automatisches aus - oder nur die
Prosa in verify, die ein Mensch lesen muss?

Gemessen statt behauptet: Es loeste bereits aus, aber als Nebenwirkung.
Ein Rehash aendert jeden Hash, also stimmt der beglaubigte Kettenkopf
nicht mehr und der bestehende Vergleich schlug an. Das funktioniert, ist
aber ein Zufallstreffer - verschoebe sich der Anker, waere der Melder
lautlos weg. Und die Meldung hiess "Eintrag wurde veraendert" statt "die
Kette wurde neu berechnet", also Wirkung statt Ursache.

Jetzt haengt der Alarm an der Sache selbst: Das Gegenbuch fuehrt
rehashCount/rehashLast im Buch mit und meldet jede neue Neuberechnung
seit der letzten Beglaubigung mit exit 2, samt Zeitpunkt, Zeilenzahl und
dem Befund, der unmittelbar davor galt. Dieselbe Lehre wie R184-01 (Gate
am Ausloeser statt an der Wirkung) und R185-01 (Wurzelwechsel statt
valid).

Reihenfolge geaendert, und das war noetig: Der neue Melder steht VOR dem
Kopf-Hash-Vergleich, sonst haette immer die unpraezisere Meldung
gewonnen. Und der Kopf-Vergleich wird nach einer bestaetigten
Neuberechnung uebersprungen - sonst waere die Bestaetigung wertlos, weil
ein Rehash den Kopf zwangslaeufig aendert. Beim Bauen aufgefallen, nicht
im Entwurf.

NOTARY_REHASH_ACK wird mit der ID des Rehash-Eintrags bestaetigt, nicht
mit true; IDs steigen streng, ein stehen gelassener Wert passt beim
naechsten Vorgang nicht mehr. Ein fehlender beglaubigter Eintrag
alarmiert weiterhin immer: bestaetigt wird die Neuberechnung, nicht das
Verschwinden von Zeilen.

Getestet mit echtem Gegenbuch gegen ein echtes CRM, SSH-signiertes
lokales Buch: Waesche ohne Datenbankzugriff -> CRM meldet valid:true und
chainGaps:[], Gegenbuch exit 2 mit der Neuberechnung als Ursache. Falsche
Ack-ID weiter exit 2, richtige exit 0, Folgelauf ruhig.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-26 18:30:44 +02:00
co-authored by Claude Opus 5
parent df442bb1a0
commit 2ca6ed2f70
5 changed files with 198 additions and 2 deletions
+37
View File
@@ -97,6 +97,43 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **⏱️ Neuberechnung der Kette ist jetzt eine eigene Gegenbuch-Alarmbedingung (Pentest R186, Frage b)** (2026-08-26)
- Der Tester fragte präzise: Löst `cleanup``rehash` **ohne** erneutes
Siegeln, über **nicht versiegelten** Inhalt, etwas **Automatisches** aus
oder nur die Prosa in `verify`, die ein Mensch lesen muss?
- **Gemessen statt behauptet:** Es löste bereits aus, aber als *Nebenwirkung*.
Ein Rehash ändert jeden Hash, also stimmt der beglaubigte Kettenkopf nicht
mehr und der bestehende Vergleich schlug an. Funktioniert ist aber ein
Zufallstreffer: Verschöbe sich der Anker, wäre der Melder lautlos weg. Und
die Meldung hieß „Eintrag wurde verändert" statt „die Kette wurde neu
berechnet", also Wirkung statt Ursache.
- Jetzt hängt der Alarm an der Sache selbst: Das Gegenbuch führt
`rehashCount`/`rehashLast` im Buch mit und meldet jede neue Neuberechnung
seit der letzten Beglaubigung mit **exit 2** samt Zeitpunkt, Zeilenzahl
und dem Befund, der unmittelbar davor galt. Dieselbe Lehre wie R184-01
(Gate am Auslöser, nicht an der Wirkung) und R185-01 (Wurzelwechsel statt
`valid`).
- **Reihenfolge geändert, und das war nötig:** Der neue Melder steht **vor**
dem Kopf-Hash-Vergleich, sonst hätte immer die unpräzisere Meldung
gewonnen. Und der Kopf-Vergleich wird nach einer *bestätigten*
Neuberechnung übersprungen sonst wäre die Bestätigung wertlos gewesen,
weil ein Rehash den Kopf zwangsläufig ändert. Beim Bauen aufgefallen, nicht
im Entwurf.
- `NOTARY_REHASH_ACK` wird mit der **ID des Rehash-Eintrags** bestätigt, nicht
mit `true`. IDs steigen streng ein stehen gelassener Wert passt beim
nächsten Vorgang nicht mehr. Analog zu `NOTARY_SEAL_ACK`.
- Ein **fehlender** beglaubigter Eintrag alarmiert weiterhin immer: Bestätigt
wird die Neuberechnung, nicht das Verschwinden von Zeilen.
- Bestandsbücher ohne das neue Feld alarmieren nicht rückwirkend, sondern
setzen die Grundlage mit Ausgabe, statt es stillschweigend zu tun.
- **Getestet mit echtem Gegenbuch gegen ein echtes CRM** (SSH-signiertes
lokales Buch): Wäsche ohne Datenbankzugriff (3 Zeilen gelöscht → Rehash)
→ CRM meldet `valid:true`, `chainGaps:[]`; Gegenbuch **exit 2** und nennt
die Neuberechnung als Ursache. Falsche Ack-ID → weiter exit 2, richtige →
exit 0 mit neuer Grundlage, Folgelauf ruhig.
- Dateien: `tools/audit-notary/notary.mjs`,
`tools/audit-notary/{docker-compose.yml,.env.example,README.md}`
- [x] **🔍 `verify` meldet jetzt, dass die Kette neu berechnet wurde** (2026-08-26)
- **Im Betrieb entdeckt, nicht im Test.** Das Staging-Gegenbuch meldete
„Der beglaubigte Eintrag 5352 existiert nicht mehr". Rekonstruktion aus dem