internal/rules implements Stufe 2 from the core principle: the LLM extracts facts, this deterministic engine judges them against versioned YAML rules. Facts/Condition/Rule/Finding types, a loader that refuses to load on a missing id/version or a duplicate rule id rather than silently skipping a bad file, and Evaluate() matching facts against rules. Two real rules grounded in verified research (see rules/OPEN.md for the open questions that surfaced along the way): - WK-001: no disclosure at all despite consideration (§ 5a Abs. 4 UWG, § 22 Abs. 1 MStV) - WK-004: disclosure present but hidden behind a "mehr anzeigen" cut (§ 5a Abs. 4 UWG, Leitfaden der Medienanstalten, LG Köln 12.05.2026) The two are deliberately disjoint (WK-004 requires disclosure_present= true) so a post with no disclosure at all doesn't double-fire both rules. Golden suite in testdata/golden/ covers both rules plus two clean cases; it's this suite, not the UI, that's the actual asset per CLAUDE.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
24 lines
895 B
Go
24 lines
895 B
Go
package rules
|
|
|
|
// Consideration ist die Gegenleistung für einen Beitrag, wie sie die
|
|
// Extraktion (Stufe 1) liefert.
|
|
type Consideration string
|
|
|
|
const (
|
|
ConsiderationPaid Consideration = "bezahlt"
|
|
ConsiderationInKind Consideration = "sachbezug"
|
|
ConsiderationNone Consideration = "keine"
|
|
ConsiderationUnclear Consideration = "unklar"
|
|
)
|
|
|
|
// Facts sind die Fakten aus der Extraktion (Stufe 1), auf denen die
|
|
// Regelauswertung (Stufe 2) urteilt. Die Extraktion liefert diese Werte,
|
|
// sie bewertet sie nicht — das Urteil fällt ausschließlich das Regelwerk.
|
|
type Facts struct {
|
|
Platform string `json:"platform"`
|
|
Consideration Consideration `json:"consideration"`
|
|
DisclosurePresent bool `json:"disclosure_present"`
|
|
DisclosureWording string `json:"disclosure_wording"`
|
|
DisclosureBeforeCut bool `json:"disclosure_before_cut"`
|
|
}
|