"""Shared normative language patterns for assertion classification. Extracted from decomposition_pass.py for reuse in the assertion engine. """ import re _PFLICHT_SIGNALS = [ r"\bmüssen\b", r"\bmuss\b", r"\bhat\s+sicherzustellen\b", r"\bhaben\s+sicherzustellen\b", r"\bsind\s+verpflichtet\b", r"\bist\s+verpflichtet\b", r"\bist\s+zu\s+\w+en\b", r"\bsind\s+zu\s+\w+en\b", r"\bhat\s+zu\s+\w+en\b", r"\bhaben\s+zu\s+\w+en\b", r"\bist\s+\w+zu\w+en\b", r"\bsind\s+\w+zu\w+en\b", r"\bist\s+\w+\s+zu\s+\w+en\b", r"\bsind\s+\w+\s+zu\s+\w+en\b", r"\bhat\s+\w+\s+zu\s+\w+en\b", r"\bhaben\s+\w+\s+zu\s+\w+en\b", r"\bshall\b", r"\bmust\b", r"\brequired\b", r"\b\w+zuteilen\b", r"\b\w+zuwenden\b", r"\b\w+zustellen\b", r"\b\w+zulegen\b", r"\b\w+zunehmen\b", r"\b\w+zuführen\b", r"\b\w+zuhalten\b", r"\b\w+zusetzen\b", r"\b\w+zuweisen\b", r"\b\w+zuordnen\b", r"\b\w+zufügen\b", r"\b\w+zugeben\b", r"\bist\b.{1,80}\bzu\s+\w+en\b", r"\bsind\b.{1,80}\bzu\s+\w+en\b", ] PFLICHT_RE = re.compile("|".join(_PFLICHT_SIGNALS), re.IGNORECASE) _EMPFEHLUNG_SIGNALS = [ r"\bsoll\b", r"\bsollen\b", r"\bsollte\b", r"\bsollten\b", r"\bgewährleisten\b", r"\bsicherstellen\b", r"\bshould\b", r"\bensure\b", r"\brecommend\w*\b", r"\bnachweisen\b", r"\beinhalten\b", r"\bunterlassen\b", r"\bwahren\b", r"\bdokumentieren\b", r"\bimplementieren\b", r"\büberprüfen\b", r"\büberwachen\b", r"\bprüfen,\s+ob\b", r"\bkontrollieren,\s+ob\b", ] EMPFEHLUNG_RE = re.compile("|".join(_EMPFEHLUNG_SIGNALS), re.IGNORECASE) _KANN_SIGNALS = [ r"\bkann\b", r"\bkönnen\b", r"\bdarf\b", r"\bdürfen\b", r"\bmay\b", r"\boptional\b", ] KANN_RE = re.compile("|".join(_KANN_SIGNALS), re.IGNORECASE) NORMATIVE_RE = re.compile( "|".join(_PFLICHT_SIGNALS + _EMPFEHLUNG_SIGNALS + _KANN_SIGNALS), re.IGNORECASE, ) _RATIONALE_SIGNALS = [ r"\bda\s+", r"\bweil\b", r"\bgrund\b", r"\berwägung", r"\bbecause\b", r"\breason\b", r"\brationale\b", r"\bkönnen\s+.*\s+verursachen\b", r"\bführt\s+zu\b", ] RATIONALE_RE = re.compile("|".join(_RATIONALE_SIGNALS), re.IGNORECASE) # Evidence-related keywords (for fact detection) _EVIDENCE_KEYWORDS = [ r"\bnachweis\b", r"\bzertifikat\b", r"\baudit.report\b", r"\bprotokoll\b", r"\bdokumentation\b", r"\bbericht\b", r"\bcertificate\b", r"\bevidence\b", r"\bproof\b", ] EVIDENCE_RE = re.compile("|".join(_EVIDENCE_KEYWORDS), re.IGNORECASE)