fix(impressum): regex [A-Z] never matches on lowercased text
Build + Deploy / build-admin-compliance (push) Successful in 12s
Build + Deploy / build-backend-compliance (push) Successful in 14s
Build + Deploy / build-ai-sdk (push) Successful in 20s
Build + Deploy / build-developer-portal (push) Successful in 13s
Build + Deploy / build-tts (push) Successful in 12s
Build + Deploy / build-document-crawler (push) Successful in 14s
Build + Deploy / build-dsms-gateway (push) Successful in 13s
Build + Deploy / build-dsms-node (push) Successful in 18s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / loc-budget (push) Failing after 15s
CI / secret-scan (push) Has been skipped
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 2m39s
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Successful in 46s
CI / test-python-backend (push) Successful in 42s
CI / test-python-document-crawler (push) Successful in 27s
CI / test-python-dsms-gateway (push) Successful in 22s
CI / validate-canonical-controls (push) Successful in 15s
Build + Deploy / trigger-orca (push) Successful in 2m28s

All patterns matched against text_lower but used [A-Z] character class.
Changed to [a-zA-Z] so patterns like "geschäftsführung: dr. oliver"
are found. Also added "Pflicht"/"Detail" labels to the two progress
bars to clarify what 100% vs 8% means.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-12 14:02:25 +02:00
parent edbf6d2be5
commit 4a7e09bbb0
2 changed files with 12 additions and 10 deletions
@@ -145,8 +145,9 @@ export function ChecklistView({ results }: { results: DocResult[] }) {
<span className="text-xs text-red-600 font-medium">Fehler</span> <span className="text-xs text-red-600 font-medium">Fehler</span>
) : ( ) : (
<div className="flex flex-col gap-1"> <div className="flex flex-col gap-1">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2" title={`Pflichtangaben: ${l1Passed}/${l1Scoreable.length}`}>
<div className="w-16 h-1.5 bg-gray-200 rounded-full overflow-hidden"> <span className="text-[10px] text-gray-400 w-7">Pflicht</span>
<div className="w-14 h-1.5 bg-gray-200 rounded-full overflow-hidden">
<div className={`h-full rounded-full ${barColor}`} style={{ width: `${pct}%` }} /> <div className={`h-full rounded-full ${barColor}`} style={{ width: `${pct}%` }} />
</div> </div>
<span className={`text-xs font-medium w-10 text-right ${ <span className={`text-xs font-medium w-10 text-right ${
@@ -154,8 +155,9 @@ export function ChecklistView({ results }: { results: DocResult[] }) {
}`}>{pct}%</span> }`}>{pct}%</span>
</div> </div>
{l2Active.length > 0 && ( {l2Active.length > 0 && (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2" title={`Detailpruefung: ${l2Passed}/${l2Active.length}`}>
<div className="w-16 h-1.5 bg-gray-200 rounded-full overflow-hidden"> <span className="text-[10px] text-gray-400 w-7">Detail</span>
<div className="w-14 h-1.5 bg-gray-200 rounded-full overflow-hidden">
<div className={`h-full rounded-full ${cBarColor}`} style={{ width: `${cpct}%` }} /> <div className={`h-full rounded-full ${cBarColor}`} style={{ width: `${cpct}%` }} />
</div> </div>
<span className="text-xs font-medium w-10 text-right text-blue-600">{cpct}%</span> <span className="text-xs font-medium w-10 text-right text-blue-600">{cpct}%</span>
@@ -111,8 +111,8 @@ IMPRESSUM_CHECKLIST = [
"label": "Registergericht benannt (Amtsgericht X)", "label": "Registergericht benannt (Amtsgericht X)",
"level": 2, "parent": "register", "level": 2, "parent": "register",
"patterns": [ "patterns": [
r"(?:amtsgericht|registergericht)\s+[A-Z\u00c0-\u017e]\w+", r"(?:amtsgericht|registergericht)\s+[a-zA-Z\u00c0-\u017e]\w+",
r"\bag\s+[A-Z\u00c0-\u017e]\w+", r"\bag\s+[a-zA-Z\u00c0-\u017e]\w+",
r"(?:handelsregister|register)\s+(?:ag|amtsgericht)\s+\w+", r"(?:handelsregister|register)\s+(?:ag|amtsgericht)\s+\w+",
], ],
"severity": "LOW", "severity": "LOW",
@@ -170,9 +170,9 @@ IMPRESSUM_CHECKLIST = [
"label": "Name der vertretungsberechtigten Person", "label": "Name der vertretungsberechtigten Person",
"level": 2, "parent": "representative", "level": 2, "parent": "representative",
"patterns": [ "patterns": [
r"(?:gesch(?:ae|ä)ftsf(?:ue|ü)hr\w*|vorstand|inhaber)\s*:?\s*[A-Z\u00c0-\u017e]", r"(?:gesch(?:ae|ä)ftsf(?:ue|ü)hr\w*|vorstand|inhaber)\s*:?\s*[a-zA-Z\u00c0-\u017e]",
r"(?:vertreten\s+durch|repr(?:ae|ä)sentiert)\s*:?\s*[A-Z\u00c0-\u017e]", r"(?:vertreten\s+durch|repr(?:ae|ä)sentiert)\s*:?\s*[a-zA-Z\u00c0-\u017e]",
r"(?:gesch(?:ae|ä)ftsf(?:ue|ü)hrung)\s*:?\s*(?:dr\.?\s+|prof\.?\s+)?[A-Z\u00c0-\u017e]", r"(?:gesch(?:ae|ä)ftsf(?:ue|ü)hrung)\s*:?\s*(?:dr\.?\s+|prof\.?\s+)?[a-zA-Z\u00c0-\u017e]",
], ],
"severity": "LOW", "severity": "LOW",
"hint": "Voller Vor- und Nachname mit Funktionsbezeichnung erforderlich (z.B. 'Geschaeftsfuehrung: Dr. Max Mustermann').", "hint": "Voller Vor- und Nachname mit Funktionsbezeichnung erforderlich (z.B. 'Geschaeftsfuehrung: Dr. Max Mustermann').",
@@ -288,7 +288,7 @@ IMPRESSUM_CHECKLIST = [
"level": 1, "parent": None, "level": 1, "parent": None,
"patterns": [ "patterns": [
r"berufshaftpflicht|haftpflichtversicherung|pflichtversicherung", r"berufshaftpflicht|haftpflichtversicherung|pflichtversicherung",
r"(?:versicherer|versicherung)\s*:?\s*[A-Z\u00c0-\u017e]", r"(?:versicherer|versicherung)\s*:?\s*[a-zA-Z\u00c0-\u017e]",
r"deckungssumme|versicherungsschutz|geltungsbereich", r"deckungssumme|versicherungsschutz|geltungsbereich",
], ],
"severity": "INFO", "severity": "INFO",