# 03 — `source_class` (Rechtsnatur / Autorität)

**Zweck:** Die Autoritäts-Achse, die den **Rang** bestimmt (siehe [02](02-authority.md)). Deterministisch abgeleitet — der noch nicht re-ingestierte (ungetaggte) Korpus wird trotzdem klassifiziert, ohne Re-Tagging des Bestands.

## Mechanik

`classifyAuthority()` (`authority.go`) entscheidet in dieser Reihenfolge:

1. **Standard-NAME-Override** — erkannter Standard-Name (NIST/OWASP/ISO 27001/CIS/CSA CCM/Grundschutz) erzwingt `technical_standard` (Gewicht 80), **auch wenn die Payload `supervisory_guidance` sagt**. Grund: der Korpus taggt viele Standards mit generischem guidance-`source_class`; der Name ist autoritativer. `binding_law` bleibt unangetastet.
2. **Explizite Payload-Werte** — gesetztes `source_class` / `authority_weight` gewinnen.
3. **Marker-Fallback** — foreign → standard → guidance → regulation → unknown.

`inferJurisdiction()`: Fremd-Marker → `CH`; enthält `§` oder DE-Marker → `DE`; sonst → `EU`.

## Konstanten + Warum

**Gewichte je Klasse** (`sourceClassFromWeight()`):

| `source_class` | Gewicht | Schwelle | Bedeutung |
|----------------|---------|----------|-----------|
| `binding_law` | `100` | w ≥ 100 | bindendes Recht (Gesetz/VO) |
| `technical_standard` | `80` | 80 ≤ w < 100 | Best-Practice-Control-Katalog (NIST/OWASP/ISO) |
| `supervisory_guidance` | `70` | 70 ≤ w < 80 | Aufsichts-/Auslegungs-Guidance (ENISA/BSI/EDPB) |
| `unknown` | `50` | default | unklassifiziert |
| `foreign_law` | `0` | w ≤ 0 | Fremdrecht (CH) |

**Marker-Listen** (Substring-Match):

| Liste | Einträge (Auszug) | Wirkung |
|-------|-------------------|---------|
| `standardMarkers` *(vor guidance geprüft)* | NIST, OWASP, Grundschutz, ISO 27001, ISO/IEC 27001, CSA CCM, Cloud Controls Matrix, CIS Benchmark, CIS Control | → `technical_standard` (80) |
| `guidanceMarkers` | DSK, EDPB, BfDI, ENISA, BSI, EUCC, Standards Mapping, Orientierungshilfe, Handreichung, Leitlinie, Empfehlung, OECD, CISA, Blue Guide, … | → `supervisory_guidance` (70) |
| `foreignMarkers` | RevDSG, fedlex, (CH) | → `foreign_law` (0) |
| `deMarkers` | BDSG, DSK, BfDI, BayLfD, BSI | Signal **DE**-Jurisdiktion |

## Der Standard-Name-Override (Fix 2026-06-25)

**Problem:** Der CE-Korpus taggt z.B. `NIST SP 800-82r3` als `source_class=supervisory_guidance` (Gewicht 70), **nicht** technical_standard. `classifyAuthority` vertraute dem Payload-Tag → NIST landete als guidance, **kein `control_standard`** im Pool → die Diversity-Regel ([05](05-control-intent.md)) konnte nichts injizieren.

**Fix:** Erkannter Standard-Name überschreibt ein fehl-getaggtes guidance/unknown-`source_class` → `technical_standard`. Code-Fix, **kein Re-Ingest** nötig. Bindendes Recht bleibt unangetastet (Sanity geprüft: Rechtsfrage liefert weiterhin binding Top-1).

## Code

- `authority.go` → `classifyAuthority()`, `sourceClassFromWeight()`, `inferJurisdiction()`

## Adressierte Fehlerklassen

- **„Standard als guidance mistagged → kein control_standard"** → Standard-Name-Override.
- **„Fremdrecht falsch eingeordnet"** → `foreignMarkers` + `foreign_law`-Gewicht 0.
