# 04 — `source_role` (Funktionale Rolle)

**Zweck:** Die zu `source_class` **orthogonale** Achse: *Was tut die Quelle im Dokument?* Sie bestimmt die **Control-Pool-Zugehörigkeit** bei Umsetzungsfragen — unabhängig von der Rechtsnatur. Deterministisch aus Markern abgeleitet, kein Re-Tagging des Bestands.

## Die 7 Rollen

| Konstante | Wert | Definition |
|-----------|------|-----------|
| `roleObligation` | `obligation` | die abstrakte Pflicht (das WAS) |
| `roleOperationalReq` | `operational_requirement` | konkrete bindende Anforderung (z.B. CRA Anhang I) |
| `roleProceduralReq` | `procedural_requirement` | Prozess: Meldung/Registrierung/DSFA/Incident |
| `roleControlStandard` | `control_standard` | Best-Practice-Katalog (NIST/OWASP/ISO/CIS) |
| `roleImplGuidance` | `implementation_guidance` | Umsetzungs-How-to (ENISA Good Practices, BSI) |
| `roleInterpretation` | `interpretation` | interpretiert die *Bedeutung* der Norm (EDPB-Leitlinie) |
| `roleDefinition` | `definition` | Definitionen / Scope / Recitals |

**Control-Pool** = `{operational_requirement, procedural_requirement, control_standard, implementation_guidance}` (die vier „wie umsetzen"-Rollen, `isControlPoolRole()`).

## Mechanik

`classifyRole()` (`control_role.go`) — Entscheidungsreihenfolge:

1. `IsRecital` → `definition`
2. `source_class == technical_standard` → `control_standard`
3. `source_class == supervisory_guidance`:
   - enthält `implMarker` → `implementation_guidance`
   - sonst → `interpretation`
4. `source_class == binding_law`:
   - `definitionMarker` → `definition`
   - `proceduralMarker` → `procedural_requirement`
   - `annexMarker` **oder** `operationalMarker` → `operational_requirement`
   - sonst → `obligation`
5. default → `obligation`

`controlRoleOf(payload)` klassifiziert die rohe Qdrant-Payload **vor** dem Mapping — so kann `searchControls` ([01](01-retrieval.md)) seinen tiefen dense-Pull filtern, ohne jeden Treffer voll zu materialisieren.

## Marker-Listen

| Liste | Einträge (Auszug) | → Rolle |
|-------|-------------------|---------|
| `proceduralMarkers` | Meldung, Meldepflicht, Notification, Registrierung, Konformitätserklärung, Incident, Reporting, Folgenabschätzung, DSFA, DPIA, Anzeigepflicht | `procedural_requirement` |
| `annexMarkers` | Anhang, Annex, Appendix, Anlage | `operational_requirement` |
| `operationalMarkers` | Anforderung, Requirement, essential, wesentliche | `operational_requirement` |
| `implMarkers` | Good Practice, Best Practice, Standards Mapping, Umsetzung, Implementation, Handreichung, Maßnahmenkatalog, ICS, SCADA, Technical Guideline, TIG | `implementation_guidance` |
| `definitionMarkers` | Begriffsbestimmung, Definition | `definition` |

## Warum orthogonal zu `source_class`

`source_class` (Rechtsnatur) und `source_role` (Funktion) sind **zwei Achsen**, nicht eine. ENISA bleibt `supervisory_guidance` (Rechtsnatur) **und** `implementation_guidance` (Funktion) — sie wird **nicht** umgetaggt (fachlich falsch), darf aber bei Umsetzungsfragen in den Control-Pool. So muss der Bestand nicht angefasst werden: `source_role` ist wie `source_class` aus Markern ableitbar.

`source_role` ist die **Wirbelsäule der Langzeit-Architektur** Regulation → Obligation → Operational Requirement → Control → Evidence ([09](09-framework-layer.md), Prio 4).

## Code

- `control_role.go` → `classifyRole()`, `controlRoleOf()`, `isControlPoolRole()`

## Adressierte Fehlerklassen

- **„Controls = nur technical_standard"** → vier Control-Pool-Rollen statt einer.
- **„abstrakte Pflicht dominiert Umsetzungsfrage"** → `obligation` ist *nicht* im Control-Pool (siehe [05](05-control-intent.md)).
