From 6b9c7984b45e5c3ccef2e334bf5123539fc3a0a4 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Sun, 21 Jun 2026 00:51:47 +0200 Subject: [PATCH] =?UTF-8?q?fix(ci):=20regulatory=5Fnews=20Zeitbomben-Test?= =?UTF-8?q?=20entschaerfen=20=E2=80=94=20test-go=20+=20Deploy=20entsperren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit test-go failte seit 2026-06-19: VBR-OBL-001 ("Widerrufsbutton ab 19.06.2026") ist seit dem Stichtag abgelaufen und faellt aus dem Zukunfts-Horizont von GetRegulatoryNews, wodurch TestGetRegulatoryNews_FromRealFiles bricht. Fix: now-Referenz injizierbar (GetRegulatoryNewsAt), Test nutzt fixes Datum -> deterministisch. Produktions-Caller unveraendert (Wrapper). admin rag-query Marker, damit detect-changes admin mitbaut (article_label-Rendering). go vet + alle ai-sdk-Tests lokal gruen. Co-Authored-By: Claude Opus 4.7 --- admin-compliance/lib/sdk/drafting-engine/rag-query.ts | 1 + ai-compliance-sdk/internal/ucca/regulatory_news.go | 8 +++++++- ai-compliance-sdk/internal/ucca/regulatory_news_test.go | 5 ++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/admin-compliance/lib/sdk/drafting-engine/rag-query.ts b/admin-compliance/lib/sdk/drafting-engine/rag-query.ts index 43537ee8..d93d5f68 100644 --- a/admin-compliance/lib/sdk/drafting-engine/rag-query.ts +++ b/admin-compliance/lib/sdk/drafting-engine/rag-query.ts @@ -5,6 +5,7 @@ * Frueher: bp-core-rag-service:8097 — der existiert auf prod NICHT (nur macmini/dev), * dadurch lieferte die Drafting-Engine dort keinen RAG-Kontext. Die ai-sdk embeddet * mit bge-m3 und ist prod-erreichbar. Genutzt von draft-, chat- und vendor-review-Routes. + * Fundstellen via article_label sind live ab dem Prod-Re-Ingest 2026-06. */ const SDK_URL = diff --git a/ai-compliance-sdk/internal/ucca/regulatory_news.go b/ai-compliance-sdk/internal/ucca/regulatory_news.go index b3247a9a..2a6a7f3f 100644 --- a/ai-compliance-sdk/internal/ucca/regulatory_news.go +++ b/ai-compliance-sdk/internal/ucca/regulatory_news.go @@ -33,6 +33,12 @@ type RegulatoryNewsFilter struct { // GetRegulatoryNews scans all v2 obligations for upcoming deadlines // and returns formatted news items sorted by urgency. func GetRegulatoryNews(regulations map[string]*V2RegulationFile, filter RegulatoryNewsFilter) []RegulatoryNewsItem { + return GetRegulatoryNewsAt(regulations, filter, time.Now().UTC()) +} + +// GetRegulatoryNewsAt is GetRegulatoryNews with an injectable reference time so the +// upcoming-deadline window is deterministic in tests (no time-bomb once a deadline passes). +func GetRegulatoryNewsAt(regulations map[string]*V2RegulationFile, filter RegulatoryNewsFilter, now time.Time) []RegulatoryNewsItem { if filter.HorizonDays <= 0 { filter.HorizonDays = 365 } @@ -40,7 +46,7 @@ func GetRegulatoryNews(regulations map[string]*V2RegulationFile, filter Regulato filter.Limit = 5 } - today := time.Now().UTC().Truncate(24 * time.Hour) + today := now.UTC().Truncate(24 * time.Hour) horizon := today.AddDate(0, 0, filter.HorizonDays) var items []RegulatoryNewsItem diff --git a/ai-compliance-sdk/internal/ucca/regulatory_news_test.go b/ai-compliance-sdk/internal/ucca/regulatory_news_test.go index 0501583b..52fec36b 100644 --- a/ai-compliance-sdk/internal/ucca/regulatory_news_test.go +++ b/ai-compliance-sdk/internal/ucca/regulatory_news_test.go @@ -174,7 +174,10 @@ func TestGetRegulatoryNews_FromRealFiles(t *testing.T) { if err != nil { t.Skipf("could not load v2 regulations: %v", err) } - items := GetRegulatoryNews(regs, RegulatoryNewsFilter{Limit: 20, HorizonDays: 730}) + // Fixed reference date so the test is deterministic regardless of the wall clock: + // VBR-OBL-001 (deadline 2026-06-19) must fall within [ref, ref+730d]. + ref := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC) + items := GetRegulatoryNewsAt(regs, RegulatoryNewsFilter{Limit: 20, HorizonDays: 730}, ref) // Should find at least the Widerrufsbutton obligation found := false for _, item := range items {