# Gap-Matrix — verifiziert gegen `main` = `d639c0b` (03.08.2026)

Kategorien (Auftrag Schritt 6): **V** vollständig vorhanden · **T** teilweise
vorhanden · **F** vorhanden, aber fehlerhaft · **D** nur dokumentiert ·
**N** nicht vorhanden · **Ü** technisch überflüssig · **R** fachlich riskant

Evidenz-Level: `[R]` = im Repo selbst verifiziert (Grep/Lauf/Test) ·
`[G]` = durch grünen Gate-/Golden-Lauf belegt · `[D]` = nur dokumentenbasiert

## Deterministischer Kern

| Req | Anforderung | Kat. | Evidenz |
|---|---|---|---|
| DET-001 | Identischer Input → identischer Content-Hash | **V** | `[G]` HICE-Repro: 2 Läufe, gleicher SHA-256; export-canonical.test.ts in CI |
| DET-002 | LLM rechnet keine Zahlen | **V** | `[R]` ai-ready.ts mit safeToSummarize; kein LLM-Pfad im Kern |
| DET-003 | Rundungen versioniert | **T** | `[R]` canonicalizeNumbers zentral; Rundungsprofil nicht als benanntes Manifest-Feld |
| DET-004 | Keine Zeitstempel im Hash | **V** | `[R]` HASH_EXCLUDED_PATHS (export-canonical.ts:80) |
| PAR-001 | QAF 8.8 lesen | **V** | `[G]` HICE-Repro 4/4, 17 real-files-Suiten grün |
| PAR-002 | QAF 9.1 Standard lesen | **T** | `[D]` Capability-Grundlagen da; keine 9.1-Golden-Fixture im Lauf |
| PAR-003 | QAF 9.1 Zeilen (CALCULATION) lesen | **T** | `[D]` generischer Pfad; kein Familienadapter, keine Fixture |
| PAR-004 | Legacy XLS (BIFF) | **V** | `[G]` legacy-workbook-shim + real-files-Test grün |
| PAR-005 | Unbekannte Bereiche nicht verlieren | **T** | `[R]` kein systematisches unmapped_regions-Inventar im Export |
| PAR-006 | Formeln + gespeicherte Werte erhalten | **T** | `[R]` beim Parse ja; nach Rehydration fehlen Formeln/Blattnamen (v2/page.tsx-Kommentar) |
| SEC-001/002/003 | ZIP-Bomb / Makros / ext. Links | **V** | `[R]` workbook-safety.ts, echte gekappte Dekompression; real-files grün |
| MAP-001/002/003 | Material-/Fertigungs-/Tooling-Matching | **V** (Paar) | `[G]` Golden-Suiten grün; global A-F: **N** |
| MAP-004 | Split/Merge | **V** (Paar) | `[G]` material-mapping golden 4/4 |
| MAP-005 | Ambiguität nicht erzwingen | **V** | `[R]` Batch verweigert Raten bei ≥3 Kandidaten |
| MAP-006 | Overrides auditierbar | **T** | `[R]` field-mapping-override.ts existiert; Auditspur nicht im kanonischen Export |
| FOR-001/002 | Formelklassen, Formel→Hardcode | **V** | `[R]` formula-engine.ts + D08 beide Wege (Stand-und-Plan §1.4, Test grün) |
| REC-001…004 | Reconciliation-Anker | **V** (ehrlich) | `[G]` 13/97/784/0-Matrix reproduziert; Coverage-UI: **T** |

## Bestätigte Kernlücken

| Req | Anforderung | Kat. | Evidenz |
|---|---|---|---|
| DIF-001 | Material → Differenzkatalog | **N** | `[R]` differences-from-material.ts existiert nicht |
| DIF-002 | Fertigung → Differenzkatalog | **N** | `[R]` differences-from-manufacturing.ts existiert nicht |
| DIF-003 | Tooling → Katalog | **V** | `[R]` differences-from-tooling.ts + Golden grün |
| DIF-004 | Stabile IDs | **V** (Paar-Scope) | `[R]` all-differences.ts, Ankerzeilen-Sortierung |
| DIF-005 | scope_removed | **N** | `[R]` NOT_YET_IMPLEMENTED-Set im Fixture-Test |
| DQ-015/016/017 | D15/D16/D17 | **D→N** | `[R]` nur Typ-Union + Severity-Matrix, keine Detektorlogik. Live-Beleg für D15-Bedarf: Datei „260401" trägt Angebotsdatum 07.04.2025 |
| CLS-003 | R-03 Vergleichsklassifikation | **N** | `[R]` nur `derived_from_identity \| undetermined` (export-envelope.ts:45) |
| SRC-001 | Original nach Ingest adressierbar | **T** | `[R]` B-04: Objekt bleibt im Bucket, storage_key-Spalte da, wird nie geschrieben — kleiner als dokumentiert |
| SRC-002 | Durchgängige SourceRef | **T** | `[R]` Parse: ja. Rehydriert: Zelle ohne Blattname |
| JSN-001 | UI-unabhängiger kanonischer Export | **N** (aktiv) | `[R]` B-05: ViewModel-Export clientseitig; buildV2Export 0 Aufrufer |
| JSN-002 | 24 Bereiche konsistent | **T** | `[R]` B-01: 19 = golden-file-treu; 24 = Spec-Erweiterung. Entscheidung nötig, kein Bug |
| JSN-003 | Explizite Section States | **T** | `[R]` v2-export.ts hat not_computed-Semantik — aber ungenutzt |
| JSN-004 | AI-ready an Contract gebunden | **T** | `[R]` ai-ready.ts steht, hängt am ViewModel-Fluss |
| JSN-005 | Presentation Package | **N** | `[R]` kein Modul |
| MUL-001 | 1–6 eigenständige QAFs | **N** | `[R]` batch.ts wählt je Gruppe EIN Paar (Z. 146ff) |
| MUL-002 | Globales Mapping | **N** | `[R]` nur Paar- und Containerlogik |
| MUL-003 | Baseline frei wählbar | **T** | `[R]` selectBaseline für Paare; kein A-F-Selektor |
| MUL-004 | Zeitreihe | **N** | `[R]` kein Modul |
| MUL-005 | Matrix | **N** (generisch) | `[R]` nur Supplier-Benchmark-Spezialfall |

## UI / Design / A11y

| Req | Anforderung | Kat. | Evidenz |
|---|---|---|---|
| CAP-001 | Capability als einzige Gate-Quelle | **T** | `[R]` Registry da; 22 harte Gates außerhalb (B-09) |
| UI-001 | QAF-nahe Reiter | **N** | `[R]` 18-Sektionen-Langseite, section-registry fix |
| UI-002 | Max. 3 Header-Aktionen | **N** | `[R]` Header bündelt Dateiersatz/Swap/Exporte/Tags/… |
| UI-003 | Progressive Offenlegung | **T** | `[R]` Action-Titles + Leerfälle da (#412–#424); Struktur bleibt Langseite |
| UI-005 | Mobile ohne Seiten-H-Scroll | **F** | `[R]` max-w-screen-lg × breite Tabellen (B-11); Runtime-Beleg steht aus |
| UI-006 | Zoom aktiv | **F** | `[R]` userScalable:false im Root-Layout (B-11) |
| UI-007 | Evidence-Panel | **T** | `[R]` qaf-v2-evidence-panel.tsx da; Provenienz nach Rehydration unvollständig |
| BMW-001…004 | Design-System-Konformität | **T** | `[R]` DCT-Petrol-Palette etabliert; neues BMW-Group-21-Token-Set (04_Tokens) nicht verdrahtet; text-destructive für Kostenanstieg = **R** (fachlich riskante Farbsemantik lt. neuem DS) |
| ACC-001/002 | WCAG 2.2 AA / Tastatur | **D** | kein A11y-Gate, kein axe-Lauf |

## Tests / CI / Betrieb

| Req | Anforderung | Kat. | Evidenz |
|---|---|---|---|
| TST-001 | Reale Golden Fixtures in CI | **T** | `[R]` lokal 17/18 Suiten echt (B-06); CI ohne Golden-Dir; anonymisierte Fixtures breiter als dokumentiert (B-07) |
| TST-002 | Mutationsproben | **V** (Praxis) | `[D]`+Historie; nicht systematisch als Gate |
| TST-003 | Visuelle Regression | **N** | `[R]` kein Setup |
| TST-004 | Determinismus in CI | **T** | `[R]` export-canonical.test.ts in CI; Contract-Hash-Wiederholungstest fehlt |
| PER-001 | Tabellen-Virtualisierung | **T** | `[D]` teils vorhanden, Schwellen uneinheitlich |
| PER-002 | 6-QAF-Budgets | **N** | kein Benchmark |
| E2E | Golden-Path-Flows | **D** | `[R]` B-10: Playwright-Scaffold, alles fixme |
| MIG-001 | V1-Paritätsmatrix | **N** | noch nicht erstellt (entsteht mit V2) |
| MIG-002 | Feature-Flags/Rollback | **T** | `[R]` Flag-Muster etabliert (multiQafDetection, KAR-925) |

## Technisch überflüssig (Kategorie Ü) — Kandidaten, keine Urteile

| Fund | Begründung | Empfehlung |
|---|---|---|
| `buildV2Export` in heutiger Form | 19-Bereiche-Envelope ohne Aufrufer; wird durch kanonischen Contract abgelöst oder zu ihm ausgebaut | in Loop 6 ausbauen, nicht löschen |
| ViewModel-Export als „der" JSON-Export | bleibt als Legacy-Profil, verliert aber den Anspruch, kanonisch zu sein | kennzeichnen, befristet erhalten |
| PNG-Export je Sektion im Header | Buttonflut; kontextbezogen sinnvoller | verschieben, nicht entfernen (Parität!) |

## Fachlich riskant (Kategorie R)

1. **Rot/Grün als Kostensemantik** (`text-destructive` bei Anstieg) —
   widerspricht dem neuen Design System (RAG nur für echte Status).
2. **Client-seitiger Export als einzige JSON-Wahrheit** — Browser-Umgebung
   bestimmt das Audit-Artefakt; kanonischer Export gehört serverseitig.
3. **CI ohne echte Golden-Files** — jede Regression an den 17 lokalen Suiten
   bleibt in CI unsichtbar; bis Loop 2 ist `main`-Grün KEIN Fachparitätsbeweis.
4. **Lint-Gate wirkungslos** (61 vorbestehende Errors, continue-on-error) —
   neue Fehler ertrinken im Bestand.
5. **Datum-Zustände live belegt**: A liefert Excel-Datum (ISO), B liefert
   Text „07.04.2025" — genau die Spec-§14-Unterscheidung; ohne D15/D16 bleibt
   der Widerspruch Dateiname (260401) vs. Inhalt (07.04.2025) unentdeckt.
