Compare commits

..

3 Commits

Author SHA1 Message Date
Benjamin Admin a064933c1f docs(master-controls): list all 4 seeded mapping tables + sentinel caveat
CI / detect-changes (push) Successful in 18s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Successful in 7s
CI / validate-canonical-controls (push) Successful in 15s
CI / loc-budget (push) Successful in 17s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m27s
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-backend (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
The guard probes mc_use_case_mappings as the existence sentinel, but the route
also queries mc_verification, mc_regulations and mc_use_case_sync_state. Document
that they are seeded together and that a half-seeded DB (sentinel present, a
sibling missing) still 500s on the sibling's queries.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-10 16:10:34 +02:00
Benjamin Admin 3e2bd91209 fix(ci): unblock deploy on main — test-go vet, loc-budget, build-sha
CI / detect-changes (push) Successful in 15s
CI / branch-name (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / build-sha-integrity (push) Successful in 8s
CI / validate-canonical-controls (push) Successful in 13s
CI / loc-budget (push) Successful in 20s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / test-go (push) Successful in 58s
CI / iace-gt-coverage (push) Successful in 26s
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-backend (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
test-go (go vet runs as part of go test) failed on two pre-existing iace spots:
- cmd/iace-audit/main.go: 6x fmt.Println with redundant trailing \n
- internal/iace/document_export_sources.go: duplicate `r == ';'` clause

build-sha-integrity failed because the alpine job installs python3 but not
pyyaml, so `import yaml` raised ModuleNotFoundError. Add py3-yaml to apk.

loc-budget flagged iace_handler_init_helpers.go (530 lines, committed state).
The other session already split it to 455 in the working tree (uncommitted);
grandfather it until that split lands, then remove the exception.

Verified locally: go test ./... all ok, go vet clean, check-loc.sh exit 0.

[guardrail-change]

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-10 14:17:27 +02:00
Benjamin_Boenisch bb6139df3e MC mapping: defensive route + MinIO overridable + iace migration 151 (#27)
CI / detect-changes (push) Successful in 18s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Failing after 8s
CI / validate-canonical-controls (push) Successful in 15s
CI / loc-budget (push) Failing after 18s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m25s
CI / test-go (push) Failing after 41s
CI / iace-gt-coverage (push) Successful in 26s
CI / test-python-backend (push) Successful in 35s
CI / test-python-document-crawler (push) Successful in 23s
CI / test-python-dsms-gateway (push) Successful in 21s
MC mapping deploy: defensive route + MinIO overridable + Migration 151 + loc-exception [migration-approved] [guardrail-change]
2026-06-10 11:54:48 +00:00
5 changed files with 25 additions and 12 deletions
+10
View File
@@ -231,3 +231,13 @@ admin-compliance/app/sdk/ai-act/page.tsx
# Endpoint-/Helfer-Gruppen geplant; bis dahin Exception mit Rationale. # Endpoint-/Helfer-Gruppen geplant; bis dahin Exception mit Rationale.
# [guardrail-change] # [guardrail-change]
backend-compliance/compliance/api/agent_doc_check_extras.py backend-compliance/compliance/api/agent_doc_check_extras.py
# --- 2026-06-10 CI-Unblocker: IACE handler init helpers ---
# iace_handler_init_helpers.go (530 im CI-Stand): Init-/Wiring-Helfer der
# IACE-Handler, ueber den 500-Cap gewachsen. Die andere Session hat die Datei
# im Working-Tree bereits auf 455 Zeilen gesplittet (uncommittet) — sobald
# dieser Split committet ist, MUSS diese Exception wieder entfernt werden.
# Bis dahin Exception mit Rationale, damit der Deploy nicht an pre-existing
# IACE-Refactor-Zwischenstand scheitert.
# [guardrail-change]
ai-compliance-sdk/internal/api/handlers/iace_handler_init_helpers.go
+1 -1
View File
@@ -422,7 +422,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
run: | run: |
apk add --no-cache git python3 apk add --no-cache git python3 py3-yaml
git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git . git clone --depth 1 --branch ${GITHUB_REF_NAME} ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git .
- name: Validate every Dockerfile + compose block declares BUILD_SHA - name: Validate every Dockerfile + compose block declares BUILD_SHA
run: | run: |
@@ -15,10 +15,13 @@ const pool = new Pool({ connectionString: dbUrl })
let metaCache: { at: number; data: unknown } | null = null let metaCache: { at: number; data: unknown } | null = null
const META_TTL_MS = 120_000 const META_TTL_MS = 120_000
// The use-case mapping tables (mc_use_case_mappings/mc_verification/mc_regulations) // The use-case mapping tables (mc_use_case_mappings, mc_verification,
// are seeded per-environment and may not exist yet on a fresh/unseeded DB. Guard // mc_regulations, mc_use_case_sync_state) are seeded together per-environment
// every mapping query so the route degrades to empty filters instead of a 500. // and may not exist yet on a fresh/unseeded DB. We probe mc_use_case_mappings as
// Cached with a short TTL so it picks up the tables once that DB gets seeded. // the existence sentinel and guard every mapping query so the route degrades to
// empty filters instead of a 500. Short TTL so it picks up the tables once seeded.
// NB: the sentinel assumes the siblings are seeded together — a half-seeded DB
// (mappings present but e.g. mc_regulations missing) would still 500 on those.
let mappingTablesCache: { at: number; present: boolean } | null = null let mappingTablesCache: { at: number; present: boolean } | null = null
async function hasMappingTables(): Promise<boolean> { async function hasMappingTables(): Promise<boolean> {
if (mappingTablesCache && Date.now() - mappingTablesCache.at < 300_000) { if (mappingTablesCache && Date.now() - mappingTablesCache.at < 300_000) {
+6 -6
View File
@@ -54,11 +54,11 @@ func cmdReachability(_ []string) {
"universe_tags": len(r.UniverseTags), "universe_tags": len(r.UniverseTags),
}) })
if len(r.UnreachablePatterns) > 0 { if len(r.UnreachablePatterns) > 0 {
fmt.Println("\n## Unreachable patterns (top 30 by priority):\n") fmt.Println("\n## Unreachable patterns (top 30 by priority):")
printPatternRows(r.UnreachablePatterns, 30) printPatternRows(r.UnreachablePatterns, 30)
} }
if len(r.WeakPatterns) > 0 { if len(r.WeakPatterns) > 0 {
fmt.Println("\n## Weakly reachable (top 20 by priority):\n") fmt.Println("\n## Weakly reachable (top 20 by priority):")
printPatternRows(r.WeakPatterns, 20) printPatternRows(r.WeakPatterns, 20)
} }
writeJSON("audit-reports/reachability.json", r) writeJSON("audit-reports/reachability.json", r)
@@ -72,7 +72,7 @@ func cmdConsistency(_ []string) {
"incomplete": r.Incomplete, "incomplete": r.Incomplete,
}) })
if len(r.IncompleteComponents) > 0 { if len(r.IncompleteComponents) > 0 {
fmt.Println("\n## Components missing tags for declared hazard categories:\n") fmt.Println("\n## Components missing tags for declared hazard categories:")
for _, c := range r.IncompleteComponents { for _, c := range r.IncompleteComponents {
fmt.Printf("- %s (%s)\n", c.ComponentID, c.NameDE) fmt.Printf("- %s (%s)\n", c.ComponentID, c.NameDE)
for _, miss := range c.MissingForCategories { for _, miss := range c.MissingForCategories {
@@ -99,7 +99,7 @@ func cmdVocabulary(args []string) {
"unknown_with_pattern_hit": len(r.SuggestedDictionaryEntries), "unknown_with_pattern_hit": len(r.SuggestedDictionaryEntries),
}) })
if len(r.SuggestedDictionaryEntries) > 0 { if len(r.SuggestedDictionaryEntries) > 0 {
fmt.Println("\n## Suggested dictionary additions (token appears in pattern scenarios but not in dict):\n") fmt.Println("\n## Suggested dictionary additions (token appears in pattern scenarios but not in dict):")
for _, s := range r.SuggestedDictionaryEntries { for _, s := range r.SuggestedDictionaryEntries {
fmt.Printf("- '%s' → seen in %d patterns. Examples: %s\n", s.Token, len(s.PatternIDs), joinFirst(s.PatternIDs, 5)) fmt.Printf("- '%s' → seen in %d patterns. Examples: %s\n", s.Token, len(s.PatternIDs), joinFirst(s.PatternIDs, 5))
} }
@@ -129,7 +129,7 @@ func cmdEcho(args []string) {
"orphaned": r.Orphaned, "orphaned": r.Orphaned,
}) })
if len(r.OrphanedPhrases) > 0 { if len(r.OrphanedPhrases) > 0 {
fmt.Println("\n## Orphaned phrases (no hazard echoes them):\n") fmt.Println("\n## Orphaned phrases (no hazard echoes them):")
for _, o := range r.OrphanedPhrases { for _, o := range r.OrphanedPhrases {
fmt.Printf("- [%s] %s\n", o.Field, truncate(o.Phrase, 120)) fmt.Printf("- [%s] %s\n", o.Field, truncate(o.Phrase, 120))
} }
@@ -163,7 +163,7 @@ func cmdHierarchy(args []string) {
"missing_info": r.MissingInfo, "missing_info": r.MissingInfo,
}) })
if len(r.IncompleteHazards) > 0 { if len(r.IncompleteHazards) > 0 {
fmt.Println("\n## Hazards with incomplete hierarchy:\n") fmt.Println("\n## Hazards with incomplete hierarchy:")
for _, h := range r.IncompleteHazards { for _, h := range r.IncompleteHazards {
fmt.Printf("- [%s] %s — missing: %s\n", h.Category, truncate(h.Name, 70), joinFirst(h.MissingLevels, 3)) fmt.Printf("- [%s] %s — missing: %s\n", h.Category, truncate(h.Name, 70), joinFirst(h.MissingLevels, 3))
} }
@@ -94,7 +94,7 @@ func extractCitedNorms(hz []Hazard, mt []Mitigation) []string {
seen := make(map[string]bool) seen := make(map[string]bool)
consider := func(s string) { consider := func(s string) {
fields := strings.FieldsFunc(s, func(r rune) bool { fields := strings.FieldsFunc(s, func(r rune) bool {
return r == ' ' || r == ',' || r == ';' || r == '\n' || r == ';' || r == '(' return r == ' ' || r == ',' || r == ';' || r == '\n' || r == '('
}) })
for i := 0; i < len(fields)-1; i++ { for i := 0; i < len(fields)-1; i++ {
head := strings.ToUpper(strings.TrimSpace(fields[i])) head := strings.ToUpper(strings.TrimSpace(fields[i]))