Protokoll: Root-Cause-Fix TestVerifyWithContext_RateSpikeTriggersAuditEvent
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-09-22 20:16:32 +02:00
1 parent f809b9f8f6
commit eca14aba9e
1 file changed
+35
+35
View File
@@ -0,0 +1,35 @@
# Prüfprotokoll: flackernder Test `TestVerifyWithContext_RateSpikeTriggersAuditEvent`
Fund aus dem Gesamtprojekt-Protokoll (`docs/GESAMTPROJEKT-PRUEFPROTOKOLL.md`, Abschnitt 16, integration/gesamtprojekt Head `94290aa`): Der Test schlug im vollen Core-Paketlauf unter Host-Last einmalig fehl, isoliert mit `-count=3` dreimal grün.
## Root Cause
`internal/serviceaccount/anomaly_test.go` baute die Ratenbasislinie über vier reale `time.Sleep(120ms)`-Abstände auf. Die anschließende "Spike"-Prüfung vergleicht den Abstand zum letzten Zugriff gegen `baseline/rateSpikeFactor` (`rateSpikeFactor = 5.0`), also eine Schwelle von **24 ms** bei einer 120-ms-Basislinie. Ein einzelner `VerifyWithContext`-Aufruf (Tokenprüfung plus mehrere DB-Round-Trips) kann diese 24 ms auf einem parallel stark ausgelasteten Testhost überschreiten — der Test maß damit eine reale Wettlaufbedingung gegen die Host-Last, nicht die Produktlogik.
Die Produktionslogik selbst (`internal/serviceaccount/anomaly.go`) ist korrekt und wurde **nicht verändert**.
## Fix
`anomaly_test.go`: Die Basislinie wird nach einem einzigen realen Zugriff direkt in der Tabelle `api_token_rate_state` auf `baseline_interval_seconds = 5.0` gesetzt (Schwelle damit 1 s statt 24 ms). Ein einzelner DB-Round-Trip unterschreitet 1 s in jeder realistischen Lastsituation sicher und deterministisch — die Testgrenze wurde nicht aufgeweicht, sondern die künstliche Zeitabhängigkeit entfernt (gleiches Muster wie der DNS-Timeout-Fix in QA-14).
## Nachweis
**Reproduktion des ursprünglichen Fehlers:** Trotz kombinierter Last (4 CPU-Busyloops auf dem 4-Kern-Host plus 30 parallele PostgreSQL-Verbindungen mit `pg_sleep`-Churn) ließ sich der Fehler in 25 isolierten Wiederholungen (`-run TestVerifyWithContext_RateSpikeTriggersAuditEvent -count=10` und `-count=15`) auf dem unveränderten `integration/gesamtprojekt`-Stand **nicht reproduzieren** — alle 25 Läufe bestanden. Der ursprüngliche einmalige Fehlschlag im Merge-Fork-Bericht hing vermutlich an einer spezifischen Kontentionssituation (z. B. gleichzeitiger `core-cluster.sh reset` mehrerer paralleler Forks auf demselben Wegwerf-Cluster), die sich mit den hier verfügbaren Mitteln nicht gezielt nachstellen ließ. Das wird hier bewusst als Grenze dokumentiert statt einer erfundenen Vorher-Zahl.
**Nachweis der Verbesserung:** Mit dem Fix liefen 10 weitere Wiederholungen unter derselben künstlichen CPU-Last stabil (0,10–0,16 s je Lauf statt 0,47–0,58 s vorher — auch spürbar schneller, weil kein `time.Sleep` mehr im Testpfad steht). Die Schwelle liegt jetzt bei 1 s statt 24 ms, eine rund 40-fache Sicherheitsmarge gegenüber der Ausgangslage.
| Prüfung | Ergebnis |
|---|---|
| `gofmt -l internal/serviceaccount/anomaly_test.go` | leer |
| `go vet ./internal/serviceaccount/...` | sauber |
| `go build ./...` | sauber |
| `TestVerifyWithContext_RateSpikeTriggersAuditEvent -count=10` unter CPU-Last (vorher, unverändert) | 10/10 PASS (keine Reproduktion des Fehlers) |
| `TestVerifyWithContext_RateSpikeTriggersAuditEvent -count=15` unter CPU+DB-Last (vorher, unverändert) | 15/15 PASS (keine Reproduktion des Fehlers) |
| `TestVerifyWithContext_RateSpikeTriggersAuditEvent -count=10` unter CPU-Last (nachher, mit Fix) | 10/10 PASS |
| `scripts/e2e-core-dms.sh` (Regression) | 10/10 PASS |
## QA und Entscheidungen
- **Entscheidung:** Baseline deterministisch seeden statt Schwelle im Produktcode aufzuweichen — folgt dem Grundsatz, Testumgebungs-Zeitabhängigkeiten zu entfernen statt Toleranzen zu erhöhen.
- **Iterationen:** 1 (Fix direkt beim ersten Versuch korrekt; Zusatzaufwand ging in den erfolglosen Reproduktionsversuch, siehe oben).
- **Offen:** Die genaue Ursache des ursprünglichen einmaligen Fehlschlags bleibt ungeklärt. Sollte er erneut auftreten, deutet das eher auf Cluster-Reset-Kontention zwischen parallelen Forks als auf diesen Test selbst hin.