# 09 — `framework_*`-Layer (Control-Mapping-Brücke)

**Zweck:** Einen **konkreten Control adressierbar** machen (z.B. `V14.2.4`), damit das System vom „welches Dokument passt?" zum „welcher konkrete Control erfüllt CRA Annex I?" übergeht. Das ist die Brücke zur nächsten Stufe — **Control → Evidence** — und der eigentliche Burggraben.

> **Ehrlicher Status:** Dieser Layer lebt **heute in der Qdrant-Payload**, nicht im Retrieval-Code. Die `ucca`-Engine liest/routet `framework_*` (noch) nicht — sie ist die **Datengrundlage**, auf der Prio 4 aufsetzt. `framework_control` reist aktuell im Feld `article` mit und ist daher bereits in den Antworten sichtbar.

## Schema (pro Chunk)

| Feld | Beispiel (OWASP) | Bedeutung |
|------|------------------|-----------|
| `framework` | `OWASP ASVS` | Rahmenwerk |
| `framework_version` | `5.0` | Version (mit `superseded`-Mechanik historisierbar, [08](08-explainability.md)) |
| `framework_section` | `V6` | Kapitel/Sektion |
| `framework_control` | `V6.2.4` | konkrete Requirement-ID — der adressierbare Control |
| `framework_section_name` | `Password Security` | menschenlesbarer Kontext |
| `asvs_level` | `L1`/`L2`/`L3` | (OWASP-spezifisch) Stufe |

Analog für NIST geplant: `framework="NIST SP 800-53"`, `framework_family="SI"`, `framework_control="SI-2"`, `framework_revision="5"`.

## OWASP ASVS 5.0 — die erste Referenz (Parser-4-Muster)

- **Quelle:** `OWASP/ASVS` GitHub, `5.0/docs_en/...flat.json` (345 Requirements). Lizenz **CC-BY-SA-4.0** (zulässig; nur CC-BY-NC ist geblockt), Attribution `OWASP`.
- **Ingestion = per-Requirement Direct-Upsert** (nicht der RAG-Chunker, der `framework_control` zerschneiden würde): 1 Qdrant-Punkt pro Requirement, `id = uuid5("owasp_asvs_5.0_"+req_id)` (idempotent), `source_class=technical_standard` / `authority_weight=80`, bge-m3-Vektor.
- **Stand:** 345 Punkte auf macmini-qdrant **und** qdrant-dev, live verifiziert (`„OWASP … Authentifizierung"` → Top-OWASP mit `V`-Codes).
- **Lehre:** Künftige Standards (NIST-Re-Tag, BSI Grundschutz) **immer** mit `source_class=technical_standard` + `framework_*` direkt setzen — das NIST-Altskript ließ `source_class` leer, daher der guidance-Mistag ([03](03-source-class.md)).

## Brücke zu Prio 4 — Control → Evidence

```
Regulation
   ↓  (legal obligation layer)
Obligation
   ↓  (source_role: operational_requirement)
Operational Requirement      ── CRA Annex I
   ↓  (Control-Mapping über framework_control)
Control                      ── OWASP V6.x · NIST SI-2 · BSI OPS.1.1
   ↓
Evidence                     ── der Nachweis, den ein Auditor sehen will
```

Der nächste Schritt verdrahtet `framework_control` in eine **Control-Mapping-Tabelle** (welcher konkrete Control erfüllt welche Obligation) und darunter die **Evidence-Schicht**. NIST + BSI ziehen im selben `framework_*`-Muster nach.

## Code / Daten

- Daten: Qdrant `bp_compliance_ce` (Payload-Felder oben), Ingestion-Skripte (`ingest_owasp.py` u.a.)
- Retrieval-Verdrahtung: **offen** (Prio 4)

## Adressierte Fehlerklassen

- **„nur Dokument-Treffer, kein adressierbarer Control"** → `framework_control` pro Chunk.
- **„Control-Katalog ohne Stand"** → `framework_version` + Supersede.
