Skip to content
Back to skills

Interessenkollision Check

ASecurity

Fuzzy-Matching neuer Mandats-Parteien gegen die Mandanten-/Gegnerliste der Kanzlei (Kölner Phonetik, Matching-Stufen S1–S4) — Datei rein, Treffer-Report raus, vollständig offline. Triggert bei Kollisionsprüfung, Interessenkonflikt, Konflikt-Check vor Mandatsannahme, § 43a BRAO / § 3 BORA, Parteien abgleichen. Die anwaltliche Kollisionsentscheidung bleibt Kanzleisache.

  • 6 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 23, 2026
ai-agentspythonbashgit

Works with

  • cli

Security analysis

A100/100

Pro scans all 11 files and shows the line behind each finding

Scanned September 23, 2026

npx -y skills add eliasreiche/legal-ops-germany --skill interessenkollision-check --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Interessenkollision Check?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Interessenkollision Check
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/eliasreiche-interessenkollision-check/badge)](https://www.skillsdirectory.com/skills/eliasreiche-interessenkollision-check)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: interessenkollision-check
description: "Fuzzy-Matching neuer Mandats-Parteien gegen die Mandanten-/Gegnerliste der Kanzlei (Kölner Phonetik, Matching-Stufen S1–S4) — Datei rein, Treffer-Report raus, vollständig offline. Triggert bei Kollisionsprüfung, Interessenkonflikt, Konflikt-Check vor Mandatsannahme, § 43a BRAO / § 3 BORA, Parteien abgleichen. Die anwaltliche Kollisionsentscheidung bleibt Kanzleisache."
status: beta
welle: 2
bereich: compliance
rdg_einordnung: "Organisatorische Kollisionsprüfung als Rechercheunterstützung; die berufsrechtliche Bewertung (§ 43a BRAO, § 3 BORA) trifft der Anwalt."
daten_hinweis: "Mandanten-/Gegnerlisten sind hochsensibel — lokal verarbeiten, nicht persistieren; § 203 StGB beachten."
haftung: "Kein Treffer ist kein Freibrief: Schreibweisen-Lücken möglich, abschließende Kollisionsprüfung bleibt Kanzleipflicht."
---

# interessenkollision-check

> **Status: `beta`** — automatisierte Tests laufen grün in CI (`tests/`,
> 91 Fälle: Normalisierung, Kölner Phonetik, Fuzzy-Maße, Matching-Stufen
> S1–S4 inkl. False-Positive-Grenzfälle, CSV-/JSON-Parsing, CLI). Noch
> **nicht** händisch abgenommen — `status: getestet` vergibt erst der
> Maintainer nach eigener Prüfung (siehe
> [CONVENTIONS.md](https://github.com/eliasreiche/legal-ops-germany/blob/main/CONVENTIONS.md), Reifegrad-Leiter).

## Zweck

Fuzzy-Matching neuer Mandats-Parteien gegen die Mandanten-/Gegnerliste der
Kanzlei — Datei rein, Treffer-Report raus, vollständig offline, keine
Persistierung. Unterstützt die organisatorische Kollisionsprüfung vor
Mandatsannahme (§ 43a Abs. 4 BRAO, § 3 BORA), ersetzt sie aber nicht: der
Executor liefert Kandidaten, die **anwaltliche Kollisionsentscheidung**
bleibt immer Kanzleisache.

Die zugrundeliegende Matching-Bibliothek
[`core/calc/matching/`](../../core/calc/matching/) ist bewusst
wiederverwendbar angelegt — Skill #13 `gwg-live-screening` (Welle 3) nutzt
sie später für den Abgleich gegen Sanktionslisten.

## Eingaben (Datei-Kontrakt, P2)

| Eingabe | Pflicht | Format | Beschreibung |
|---|---|---|---|
| Mandanten-/Gegnerliste | ja (`--liste`) | `.csv`, `;`-getrennt, UTF-8 (BOM toleriert) | Pflichtspalten `name;rolle;typ`, optional `az;notiz`. Vollständiger Kontrakt: [`schema/README.md`](schema/README.md), Beispiel: [`schema/beispiel-mandantenliste.csv`](schema/beispiel-mandantenliste.csv). |
| Neue Parteien | ja (`--parteien`) | `.csv` (gleicher Kontrakt, nur `name` Pflicht) oder `.json` (Liste von Objekten mit mindestens `name`) | Beispiel: [`schema/beispiel-neue-parteien.json`](schema/beispiel-neue-parteien.json). |

Beide Dateien werden vom Executor nur **gelesen** — keine Kopie, keine
Persistierung, kein Netzwerkzugriff. Die Verarbeitung findet vollständig
lokal statt.

## Ablauf

1. **Claude beschafft/erstellt die beiden Eingabedateien** (Mandanten-/
   Gegnerliste und neue Parteien) nach dem Kontrakt in
   [`schema/README.md`](schema/README.md). Fehlt eine der Dateien oder eine
   Pflichtangabe, fragt Claude nach — es ergänzt nie Namen, Aktenzeichen
   oder Rollen selbst (Anti-Halluzination).
2. **Claude ruft den Executor auf** (kein eigenes Namensvergleichen durch
   das Modell):

   ```bash
   python3 ${CLAUDE_PLUGIN_ROOT}/skills/interessenkollision-check/executor.py \
     --liste <mandantenliste.csv> \
     --parteien <neue_parteien.csv|.json> \
     [--output <report.json>] \
     [--schwelle-moeglich <float, Default 0.85>]
   ```

3. **Der Executor entscheidet Stufe und Score jedes Kandidaten-Paars
   deterministisch** (P3, Deterministik-Grenze): S1 exakt nach
   Normalisierung, S2 Token-Mengen-Gleichheit/-Teilmenge, S3 Kölner
   Phonetik je Token, S4 Fuzzy-Ratio ≥ Schwelle — siehe
   [`schema/README.md`](schema/README.md#match-stufen) für die vollständige
   Definition. Claude liest ausschließlich den JSON-Report und übernimmt
   `stufe`, `score` und `begruendung` unverändert — es vergibt selbst nie
   eine Stufe oder einen Score.
4. **Claude stellt den Report als Markdown-Tabelle dar**: je Kandidaten-Paar
   neue Partei, Listeneintrag (mit Rolle und Aktenzeichen), Stufe/Regel,
   Score, Begründung. Dabei immer:
   - `treffer` und `moeglicher_treffer` optisch unterscheiden (z. B. ✅ /
     ⚠️), sortiert wie im Report (Treffer vor möglichen Treffern);
   - bei **jedem** `moeglicher_treffer` **und** bei **jedem Treffer mit
     Gegner-Rolle** (Listeneintrag oder neue Partei mit `rolle: gegner`)
     ausdrücklich darauf hinweisen, dass die Kollisionsentscheidung
     (§ 43a Abs. 4 BRAO, § 3 BORA) beim Anwalt liegt — der Report liefert
     Kandidaten, keine Entscheidung;
   - die Zusammenfassung nennen (Anzahl neuer Parteien, Listeneinträge,
     geprüfter Paare, Treffer, möglicher Treffer);
   - **immer** den Hinweis "kein Treffer ist kein Freibrief" anbringen,
     wenn eine oder mehrere neue Parteien in **keinem** Kandidaten-Paar
     auftauchen (siehe `haftung`-Feld oben und die bewussten Grenzen in
     [`schema/README.md`](schema/README.md#bewusste-grenzen));
   - erwähnen, dass die Verarbeitung vollständig lokal/offline erfolgte und
     keine der beiden Listen durch den Skill gespeichert wurde.
5. Bei Exit-Code 2 (Eingabefehler: Datei fehlt, Pflichtspalte fehlt,
   ungültiger `rolle`/`typ`-Wert, kaputtes JSON, nicht unterstützte
   Dateiendung, Schwelle außerhalb `[0.0, 1.0]`) gibt Claude die
   Fehlermeldung wieder und korrigiert die Eingabe bzw. fragt nach — es
   rät kein Ergebnis.

## Output-Format

JSON-Report nach [`schema/README.md`](schema/README.md#ausgabe-json-report),
Beispiel: [`schema/beispiel-report.json`](schema/beispiel-report.json)
(tatsächlich vom Executor erzeugt aus den beiden Beispieldateien, mit je
einem Treffer auf jeder der vier Stufen sowie einer echten
Nichttreffer-Partei). Jeder Score/jede Zahl im Report stammt aus
`executor.py`, nie vom Modell (P3).

## Beispiel

Eingabe: [`schema/beispiel-mandantenliste.csv`](schema/beispiel-mandantenliste.csv)
(5 Einträge) + [`schema/beispiel-neue-parteien.json`](schema/beispiel-neue-parteien.json)
(5 neue Parteien).

Von Claude präsentiertes Ergebnis (aus dem Report übernommen):

| Neue Partei | Listeneintrag (Rolle, Az.) | Stufe | Score | Begründung |
|---|---|---|---|---|
| Bau Mustermann GmbH | Mustermann Bau GmbH (mandant, 12/2024) | ✅ treffer (S2) | 1.0 | Token-Mengen-Gleichheit nach Normalisierung: {bau, mustermann} |
| Erika Mustermann | Erika Mustermann (mandant, 34/2023) | ✅ treffer (S1) | 1.0 | exakter Treffer nach Normalisierung |
| Schmitt | Schmidt (gegner, —) | ⚠️ moeglicher_treffer (S3) | 1.0 | phonetisch identisch nach Kölner Phonetik: 862 = 862 |
| Beispiel Handels GmbH | Beispiel Handel GmbH & Co. KG (gegner, —) | ⚠️ moeglicher_treffer (S4) | 0.97 | Ähnlichkeit 0.97 ≥ Schwelle 0.85 |

**Nicht getroffen:** "Voellig Unbeteiligte Partei GmbH" erscheint in keinem
Kandidaten-Paar — das ist **kein Freibrief**, sondern bedeutet nur: keine
der implementierten Match-Stufen hat einen Zusammenhang mit der
Mandanten-/Gegnerliste gefunden (siehe bewusste Grenzen in
[`schema/README.md`](schema/README.md#bewusste-grenzen)).

**Hinweis zur Kollisionsprüfung:** Bei "Schmitt"/"Schmidt" und
"Beispiel Handels GmbH"/"Beispiel Handel GmbH & Co. KG" handelt es sich um
`moeglicher_treffer` — die Kollisionsentscheidung (§ 43a Abs. 4 BRAO, § 3
BORA) trifft der Anwalt. "Beispiel Handel GmbH & Co. KG" trägt zudem die
Rolle `gegner` — auch bei einem eindeutigen `treffer` mit Gegner-Rolle wäre
dieser Hinweis zwingend.

## Bewusste Grenzen (Kurzfassung, vollständig in schema/README.md)

- Rechtsform-Gleichheit allein ist nie ein Treffer ("Müller GmbH" vs.
  "Schulze GmbH" matcht nicht).
- Kölner Phonetik ist für deutsche Lautung entwickelt.
- Kurze Namen bergen ein erhöhtes Fuzzy-False-Positive-Risiko trotz der
  hoch angesetzten Default-Schwelle (0.85).
- Kein Abgleich über Aktenzeichen/Notiz-Text — nur `name`-Felder werden
  verglichen.
- Ein `kein_treffer` ist **kein Freibrief**: Spitznamen, Umfirmierungen
  oder Transliterationen aus anderen Schriftsystemen bleiben ggf.
  unentdeckt. Die abschließende Kollisionsprüfung bleibt Kanzleipflicht.

Files in this skill

  • SKILL.md8 KB
  • executor.py12.2 KB
  • schema/README.md7.2 KB
  • schema/beispiel-mandantenliste.csv325 B
  • schema/beispiel-neue-parteien.json380 B
  • schema/beispiel-report.json2.2 KB
  • tests/test_fuzzy.py2.3 KB
  • tests/test_koelner_phonetik.py2.8 KB
  • tests/test_konflikt_executor.py11.5 KB
  • tests/test_konflikt_executor_cli.py7.9 KB
  • tests/test_normalisierung.py3.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.